如果数据不够,请重复AsyncTask

时间:2017-07-21 08:32:15

标签: java android multithreading android-asynctask android-volley

我需要向服务器发出几个请求以下载我需要的所有数据。但是我永远不知道可能需要多少个服务器请求。所以我的第一个想法是在循环中这样做:

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

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

这不起作用,因为循环不会等待,直到异步任务在回调中完成并产生许多不需要的任务。

问题: 如果我不知道有多少次我需要重试任务,那么在我拥有所需的所有项目之前,重试数据下载的正确方法是什么?

4 个答案:

答案 0 :(得分:0)

请勿使用interface SquareConfig { color: string; width?: number; enabled: boolean; } 循环。最干净的方法是重新启动do-while内的AsyncTask。像这样的东西

Callback

注意:使用大写字母启动类名。

答案 1 :(得分: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();
            }
        }
    });
}

答案 2 :(得分:0)

您不需要回调,也不需要多个线程(在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");

答案 3 :(得分:0)

您可以放置​​检查逻辑并在回调中重新执行请求,如下所示:

void load() {
    new DataTask().getMyData(new MyCallback() {
        void onComplete(List<Item> items) {
            goodItems.addAll(items);
            if (goodItems.size() < 20) {
                load();
            }
    });
}