2016-12-30 17 views
-2

私のアプリは定期的にウェブからデータを取得し、5分ごとにそれを更新する必要があります。同様に、Asynctaskを使ってコンテンツを取り出し、UIスレッドに送る前にバックグラウンドスレッドで処理していました。最近、私はAsynctaskローダーとその利点について知りました。しかし、5分ごとに定期的にローダーを呼び出してコンテンツを更新する方法を理解することはできません。Android:非同期タスクローダー

(私は(task.executeを呼び出すためにタイマーを使用していた以前に注意してください)。私は、新しいコンテンツがある場合は、最後に私のリストビューを更新する必要があります。)

答えて

1

私はすべてのあなたのデータを更新するためのタイマーを使用したいです5分。タイマーの内部で非同期タスクを作成します。データをdoInBackground()に取得します。 UIをonPostExecute()に更新してください。 doInBackground()に取り込んだデータをonPostExecute()に渡すことができます。詳細については、https://developer.android.com/reference/android/os/AsyncTask.html

+0

これまで私がこれまで行ってきたことです。しかし、回転画面ではアクティビティが再開し、ローダーはasynctasksより優れていることがわかりました。どう思いますか?ローダーを使用してデータを定期的に更新する同じタスクを実行する方法はありますか? –

+0

これを確認してください:http://stackoverflow.com/questions/7120813/asynctaskloader-vs-asynctask – beeb

1

アプリが実行されているときにのみコードを実行したい場合は、定期的にタスクを呼び出し、情報を取得した後にUIスレッドで何かを実行するには、ScheduledExecutorServiceを使用できます。あなたの活動で

、宣言:scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

private ScheduledExecutorService scheduleTaskExecutor; 

scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 

Future<?> future = scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
    @Override 
    public void run() { 
     // Fetch your data 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       // Do the update in your UI 
      } 
     }); 

    } 
}, 0, 5, TimeUnit.MINUTES); 

をあなたは、後で使用することを再利用するために、あなたの活動のであなたのScheduledExecutorServiceをキャンセルする必要がある場合:

future.cancel(true); 

の場合サービスを削除するには、次のようにしてください:

scheduleTaskExecutor.shutdown(); 
1

私はそれを最終的に考え出しました。

ローダーを使用している間、ローダーを新しいデータで定期的に更新する必要がある場合は、initLoaderではなくrestartLoaderを使用する必要があります。 RestartLoaderは以前のローダを強制終了して新しいローダを確立しますが、initLoaderはそのローダが既に存在する場合はそのローダの作成を無視します。