0

私は必要なすべてのデータをダウンロードするためにサーバにいくつかのリクエストを行う必要があります。しかし、どのくらいの数のサーバーへの要求が必要なのか分かりません。だから私の最初の考えはそうのようなループでそれを行うことでした。データが不足している場合は、AsyncTaskを繰り返してください。

ArrayList<Item> goodItems = new ArrayList<Item>(); 
boolean isDone = false; 

do{ 
    new dataTask().getMyData(new myCallback() { 
     // ...some logic here... 
    }); 
} 
while(goodItems.size() < 20 || isDone != true); 

ループはそれまでは非同期タスクがコールバックで完了し、不要なタスクの多くを生成している待つことはありませんので、これは、動作しませんでした。

質問: 私は、タスクを再試行する必要がありますどのように多くの時間がわからない場合、私は、私が必要とするすべてのアイテムを持ってまで、データのダウンロードを再試行するための正しい方法でしょうか?

+0

ループをAsyncTask内に置く –

+0

Volleyのlib rary。これは、再試行ポリシーがそのままの状態で行われます。再試行回数と再試行間隔を設定できます。 – SripadRaj

+1

また、サイドノート:|バイナリORであるなら、||代わりに論理ORを使用します。私はそれが擬似コードだと思います – rubenwardy

答えて

0

あなたは、このためのコールバックを必要としない、また、あなたがより多くを必要としません1つのスレッド(UIスレッドの横)よりも優先されます。

doInBackgroundメソッドの内部で、あなたのループを入れて:

private class DownloadTask extends AsyncTask<URL, Void, ArrayList<Item>> { 

    boolean isDone = false; 

    protected Long doInBackground(URL... urls) { 

     ArrayList<Item> goodItems = new ArrayList<Item>(); 

     while (goodItems.size() < 20 || isDone != true) { 
      // request and adding of items to goodItems 
     } 

     return goodItems; 
    } 

    protected void onPostExecute(ArrayList<Item> result) { 
     // update views 
    } 
} 

スタート、このようなAsyncTask:

new DownloadTask().execute("exampleurl.com/data"); 
0

do-whileループを使用しないでください。最もきれいな方法はCallbackの中のAsyncTaskを再起動することです。このようなもの

MyCallback cb = new MyCallback(){ 
if(goodItems.size() < 20) new DataTask().getMyData(cb); 
} 
new DataTask().getMyData(cb); 

注:クラス名は、上の文字で始まります。

0

私はこれを行うための機能を作り、そしてあなたが応答を取得できない場合は再びそれを呼びたい:

ArrayList<Item> goodItems = new ArrayList<Item>(); 

void fetchItems() { 
    new dataTask().getMyData(new myCallback(){ 
     @Override 
     public void onComplete(List<Item> items) { 
      // some logic here 
      if (goodItems.size() < 20 || isDone != true) { 
       fetchItems(); 
      } 
     } 
    }); 
} 
0

あなただけのチェックロジックを入れることができますので、のようなあなたのコールバック内部の要求を再実行します:

void load() { 
    new DataTask().getMyData(new MyCallback() { 
     void onComplete(List<Item> items) { 
      goodItems.addAll(items); 
      if (goodItems.size() < 20) { 
       load(); 
      } 
    }); 
} 
関連する問題