Android студия ждет завершения выполнения кода запроса на обслуживание залпа, прежде чем сделать деятельность доступной для пользователя - PullRequest
0 голосов
/ 29 марта 2020

У меня есть некоторый код (включенный далее), который запускается при загрузке домашней страницы моих приложений. Он использует buildconfig и общие настройки для проверки, является ли это новой установкой. Если это новая установка, то выполняется ряд шагов, которые эффективно используют запросы залпа для извлечения данных с удаленного сервера и их копирования в базу данных sqlite на устройстве.

ПРОБЛЕМА:

Процесс копирования этих таблиц занимает довольно много времени, и, поскольку они являются залповыми запросами, они выполняются в фоновом режиме. Таким образом, это означает, что запросы залпа все еще заняты, когда действие полностью загружено. Затем я рискую, чтобы пользователь взаимодействовал с действием - и, возможно, открыл другое действие, прежде чем данные были скопированы в базу данных sqlite, и это может привести к таким проблемам, как нулевые значения и т. Д. c.

* 1006. * Есть ли способ добавить индикатор прогресса или что-то в этом роде в код ниже, который будет отключать пользовательскую активность, пока загрузка данных sqlite не будет полностью завершена?

Полный метод здесь (этот метод вызывается из создаваемого действия).

 private void checkFirstRun(FirebaseUser user){

        final String PREF_VERSION_CODE_KEY = "version_code";
        final int DOESNT_EXIST = -1;

        // Get current version code
        int currentVersionCode = BuildConfig.VERSION_CODE;

        // Get saved version code
        SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
        int savedVersionCode = prefs.getInt(PREF_VERSION_CODE_KEY, DOESNT_EXIST);


        if (currentVersionCode == savedVersionCode) { // This is just a normal run

            // check version table
            // if changed then reload
            // pass intent to home page to proceed as normal

            Log.d(TAG, "jjjj1: " + "normal run");


        } else if (savedVersionCode == DOESNT_EXIST) { // This is a new install (or the user cleared the shared preferences)


            // if user doesnt exist in db add to server db
            String strUser = user.getUid();
            String strDisplayName = user.getDisplayName();
            String strEmail = user.getEmail();
            clsServerClass.addUserToServer(strUser, strDisplayName, strEmail, context);

            // load tables into sqlite database
            clsServerClass.copyTblVersions(context);
            clsServerClass.copyAnimalClassTable(context);
            clsServerClass.copyAnimalGroupTable(context);
            clsServerClass.copyAnimalTable(context);
            clsServerClass.copyTblSeasons(context);
            clsServerClass.copyRegions(context);
            clsServerClass.copyCountries(context);
            clsServerClass.copyProvinces(context);
            clsServerClass.copyHotspots(context);
            clsServerClass.copyHabitats(context);
            clsServerClass.getMyPlaces(strUser, context);
            clsServerClass.getSightingsUser(strUser, context);


        } else if (currentVersionCode > savedVersionCode) { // This is an upgrade

            Log.d(TAG, "jjjj1: " + "upgrade");

        }

        // Update the shared preferences with the current version code
        prefs.edit().putInt(PREF_VERSION_CODE_KEY, currentVersionCode).apply();


    }

В приведенном выше коде это вызовы запросов на залп (это происходит с первым if):

           // load tables into sqlite database
            clsServerClass.copyTblVersions(context);
            clsServerClass.copyAnimalClassTable(context);
            clsServerClass.copyAnimalGroupTable(context);
            clsServerClass.copyAnimalTable(context);
            clsServerClass.copyTblSeasons(context);
            clsServerClass.copyRegions(context);
            clsServerClass.copyCountries(context);
            clsServerClass.copyProvinces(context);
            clsServerClass.copyHotspots(context);
            clsServerClass.copyHabitats(context);
            clsServerClass.getMyPlaces(strUser, context);
            clsServerClass.getSightingsUser(strUser, context);

ниже приведен пример одного из вызовов clsServerClass:


    public void copyCountries(Context context) {

        // drop table first
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS tbl_lookup_countries");

        // create table
        sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS tbl_lookup_countries(" +
                "country_unique_key INT, " +
                "country_key INT, " +
                "country_name VARCHAR," +
                "country_continent_key INT," +
                "country_polygon VARCHAR);");

        // pull the table from the database
        String strUrlReg = getUrl("selectjson", "Select * from tbl_lookup_countries");

        final ClsVolleyService clsVolleyServiceReg = new ClsVolleyService(context);
        clsVolleyServiceReg.getJsonArraydata(strUrlReg, new ClsVolleyService.VolleyCallback() {
            @Override
            public void getResponse(JSONArray response) {

                try {
                    for (int i = 0; i < response.length(); i++) {

                        JSONObject jsonObject = response.getJSONObject(i);

                        String str1 = jsonObject.getString("country_unique_key");
                        String str2 = jsonObject.getString("country_key");
                        String str3 = jsonObject.getString("country_name");
                        String str4 = jsonObject.getString("country_continent_key");
                        String str5 = jsonObject.getString("country_polygon");

                        String strQuery = "INSERT INTO tbl_lookup_countries (" +
                                "country_unique_key, " +
                                "country_key, " +
                                "country_name, " +
                                "country_continent_key, " +
                                "country_polygon) " +
                                "VALUES(?, ?, ?, ?, ?);";

                        SQLiteStatement stmt = sqLiteDatabase.compileStatement(strQuery);
                        stmt.bindString(1, str1);
                        stmt.bindString(2, str2);
                        stmt.bindString(3, str3);
                        stmt.bindString(4, str4);
                        stmt.bindString(5, str5);

                        stmt.execute();


                    }
                }  catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        });

    }

и запроса на обслуживание залпа, вызываемого из clsServerClass


    public void getJsonArraydata(String url, final VolleyCallback callback){

        try {
            JsonArrayRequest jsonArrayReq = new JsonArrayRequest
                    (Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {
                            Log.d(TAG, "vvvvq: " + response);
                            callback.getResponse(response);
                        }

                    }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.d(TAG, "vvvvq: " + error);
                        }
                    });

            // Access the RequestQueue through your singleton class.
            ClsMySingleton.getInstance(mContext).addToRequestQueue(jsonArrayReq);

        } catch(Exception e){

        }

    }
...