2016-07-14 7 views
0

私はいくつかの目的をsqliteデータベースに保存するアンドロイドアプリケーションを作成しています。また、新しいコンテンツがあれば、オンラインのmysqlデータベースからそのコンテンツを取得しています。Asyncを使用している間にスキップされたフレーム

メインアクティビティが起動すると、リストビューでsqlite dbから格納されたデータが読み込まれ、次にVolleyでJsonObjectRequestが実行されます。 (非同期タスク)

しかし、それでもまだ、私は次のエラーを取得しています主な活動を開始

Skipped 88 frames! The application may be doing too much work on its main thread. 
Skipped 34 frames! The application may be doing too much work on its main thread. 

88個のフレームがすべて格納されたデータをロードし、SQLiteデータベースからです。 私はリフレッシュするためにスワイプするので、私はJsonObjectRequestを行うだけで34フレームのようなエラーを取得します。

多分、AsyncTaskにもsqlite dbをロードする必要がありますか? または、別の解決方法がありますか?

私はあなたの意見を聞きたいです。 ありがとうございます。

Wiljan

EDIT:

私は今、このように非同期にそれを置く:

private class syncData extends AsyncTask<Void, Void, Void> { 
    private KerntaakListAdapter adapter; 

    public syncData(KerntaakListAdapter adapter) { 
     this.adapter = adapter; 
    } 

    /** 
    * The system calls this to perform work in a worker thread and 
    * delivers it the parameters given to AsyncTask.execute() 
    */ 
    @Override 
    protected Void doInBackground(Void... params) { 
     dataSource.syncData(swipeRefreshLayout); 
     return null; 
    } 

    /** 
    * The system calls this to perform work in the UI thread and delivers 
    * the result from doInBackground() 
    */ 
    protected void onPostExecute(String result) { 
     adapter.notifyDataSetChanged(); 
    } 
} 

そして、これでそれをトリガー:

new syncData(adapter).execute(); 

しかし、それはまだ私を与えますスキップされたフレームエラー。フレームは少し減っていますが。

+1

したがって、データベースを別のスレッドでも読み取るようにしてください。あなたのアプリにはフレームドロップを引き起こす他のものがあるかもしれません – Eenvincible

答えて

1

多分、AsyncTaskにsqlite dbの読み込みを入れなければならないのですか?それとも別の解決策がありますか?

はい、デフォルトでは、すべてのデータベース操作はスキップされたフレームにつながるUIスレッドで実行されます。

バックグラウンドスレッドでクエリを実行する必要があります。あなたに最適なものを使用してください。AsyncTask、またはThreadでも可能です。

loader managerにアクティビティに付随する非常に便利なライフサイクルがあるため、Loaderフレームワークを選択クエリに使用することをお勧めします。また、基礎となるデータを監視し、変更されたデータをContentObserverで更新することもできます。

ContentProviderを使用する場合は、挿入、更新、削除などの他のクエリが必要な場合は、AsyncQueryHandlerもご覧ください。

+0

チップのThnx!私はそれを試しましたが、それはまだ助けになりません..詳細について私の質問で私の編集をお読みください。 –

+0

申し訳ありませんが、あなたが示したコードは絶対に上手く見えます。それでもまだフレームがスキップされている場合は、問題がどこか他の場所にあることを意味します。UIスレッドで作業が多すぎる可能性があります。たぶんバックグラウンドに移動することができ、データを記録したり、ビューの階層を非効率的にしたり、改善することができる計算があるかもしれません。http:// stackoverflowを見てください。com/questions/14678593/the-application-may-be-doing-on-the-main-threadを見て、探し続ける..幸運:) –

+0

新しい質問を更新/投稿することができます根本原因はまだそれを修正する方法を知らない。これまでのところそれはよさそうだ。ご意見をお聞かせください。 –

関連する問題