これまでAndroidでSQLiteを使っていましたが、これは初めてのデータ処理です。AndroidでのSQLite操作
初めて自分のアクティビティを開くと、サーバーからデータがダウンロードされます。私はGoogleのボレーライブラリを使用しているので、私は非同期タスクでそれを実行する必要はないと仮定します。
しかし、私の問題は、データをsqlite dbに保存しているようですが、その1回のリクエストで返される行は500-1000です。その時点から、いつでも新しいデータがサーバーに追加されてFCMを使用してアプリケーションを更新するので、問題はありません。
これらのすべてのレコードを保存している間に、何が起こっているのかを説明する循環的なプログレスバーとメッセージをユーザーに表示したいのですが、データの保存中にアプリが10-15秒間フリーズしています。フリーズというのは、プログレスバーが動かなくなり、プロセスが完了するまでアクティビティのコンポーネントとビューがロードされないということです。
これは私の質問ですが、これを行う正しい方法は、操作が完了する前にビューがロードされ、スムーズなプログレスバーアニメーションができるUIスレッドに干渉しないようにすることです。
私は、非同期タスクを使用してみましたが、性能には変化に気づいていない:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bus_schedules);
new SaveDataAsync().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
}
private class SaveDataAsync extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
getSchedules();
return null;
};
}
protected void getSchedules() {
showProgress(true)
mScheduleReq.all(new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
JSONArray schedules = response;
for (int c = 0; c < schedules.length(); c++) {
JSONObject schedule = schedules.getJSONObject(c);
mSchedulesDat.save(new TravelSchedule(
schedule.getInt("id"),
schedule.getInt("company_id"),
schedule.getInt("route_id"),
schedule.getString("class"),
(float) schedule.getDouble("fare"),
schedule.getString("weekday"),
schedule.getString("reporting_time"),
schedule.getString("departure_time"),
schedule.getInt("by_bus"),
schedule.getInt("by_plane")
));
// Saving Extras
JSONArray extras = schedule.getJSONArray("extras");
for (int k=0; k < extras.length(); k++) {
JSONObject extra = extras.getJSONObject(k);
mExtrasDat.save(new Extra(
extra.getInt("id"),
schedule.getInt("id"),
extra.getString("category"),
extra.getString("name"),
(float) extra.getDouble("price"),
extra.getString("description"),
extra.getString("company")
));
}
// This will prevent fetching all data again from server the next time
mAppDat.save("initialised_travel_schedules", String.valueOf(true));
}
} catch (JSONException e) {
e.printStackTrace();
}
// Hide progress bar
showProgress(false);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// Hide progress bar
showProgress(false);
// Parse and display network error response
showNetworkResponse(mContext, error);
}
});
}
SQLiteのためのAsyncTaskが必要です。 FCMを使用している場合は、Firebaseデータベースを使用してください。 –
@ user3718908入力ストリーム解析のためにLoganSquareでAsyncTaskを使用しようとすることができます。 –