У меня есть некоторый код (включенный далее), который запускается при загрузке домашней страницы моих приложений. Он использует 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){
}
}