2017-04-27 17 views
0

これまで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); 
     } 
    }); 
} 
+0

SQLiteのためのAsyncTaskが必要です。 FCMを使用している場合は、Firebaseデータベースを使用してください。 –

+0

@ user3718908入力ストリーム解析のためにLoganSquareでAsyncTaskを使用しようとすることができます。 –

答えて

1

あなたはUIに他のすべての更新プログラムをブロックしているUI /メインスレッド上で作業を行っているが。処理が必要な重い処理は、ローダー、AsyncTask、または(好ましくは)RxJavaを使用して、バックグラウンドで処理する必要があります。

reactive/RxJavaルートに行くことを決めたら、https://github.com/square/sqlbriteを試してみることをお勧めします。これにより、データの受信時に、クエリの登録/取り消し、バックグラウンドでの操作の挿入、および結果の非同期ビュー(アクティビティ、フラグメントなど)の投稿が可能になります。

The official docsは、あなたが深く掘り下げたい場合はAndroid上で動作します。

+0

私はASYNCタスクで使用しようとしましたが、違いはありませんでしたので、前のコードに戻りました。たぶん私は何か正しいことをしていなかったでしょう。 – user3718908

+0

質問のあるコードサンプルを投稿すると、間違ったことが起きた可能性があります。 –

+0

質問私のactivtyの 'onCreate'には、自分のASYNCタスクにSQLite関数に渡す変数' context = getApplicationContext'があります。これはなぜ私が変更を見なかったのと関係がありますか? – user3718908

関連する問題