我需要向服务器发出几个请求以下载我需要的所有数据。但是我永远不知道可能需要多少个服务器请求。所以我的第一个想法是在循环中这样做:
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 :(得分: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();
}
});
}