【发布时间】:2015-08-12 21:28:11
【问题描述】:
我有一组 HTTP 请求,每个响应都会向 ArrayList 添加一个条目。后来我使用该列表进行一些检查。 如何让程序等到所有请求都完成并且列表已填满后再继续检查?
编辑
代码示例:
class BackgroundTask extends AsyncTask<Void,String,Void>{
List<Integer> responses;
@Override
protected synchronized Void doInBackground(Void... params) {
responses= new ArrayList<Integer>();
for( int i=0; i<10; i++ ){
restAPI.getNextInt( // SEND HTTP REQUEST
new Response.OnSuccess() { // ON SUCCESS CALLBACK
@Override
public void onResponse(Integer i) {
responses.add(i);
}},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}});
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
在我的主线程中:
BackgroundTask bt = new BackGroundTask();
bt.execute();
bt.get(10000, TimeUnit.MILLISECONDS); // THIS DOESN'T WAIT
if( bt.responses.contains(10) ){
...
}
我之前没有提供代码,因为我正在寻找通用解决方案,而不是特定于我的解决方案
编辑 2
这是我的第二次尝试,但没有成功。我把所有东西都放在主线程中。
final Semaphore sema = new Semaphore(-params.size()+1);
final List<Integer> responses = Collections.synchronizedList(new ArrayList<Integer>());
for( final Param p : params ){
new Thread(){
@Override
public void start(){
restAPI.nextInt(p, // SEND HTTP REQUEST
new Response.OnSuccess() { // ON SUCCESS CALLBACK
@Override
public void onResponse(Integer i) {
System.out.print("aaaaa");
sema.release();
responses.add(i);
}},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
sema.release();
}});
}
}.start();
}
try {
sema.acquire();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
if( responses.contains(10) )
...
现在发生的事情是 sema.acquire() 中的所有内容都阻塞/停止,并且 aaaaa 永远不会打印。如果我删除 sema.acquire() 然后 aaaaa 打印。
如果这很重要,整个代码都在 AsyncTask 的 protected void onPostExecute(Void result) 中...
【问题讨论】:
-
您是否在单独的线程中运行每个 HTTP 请求?
-
使用一个 AsyncTask ...
-
@markg 不,我有一个 for 循环可以在 AsyncTask 中的同一线程上发送所有请求
-
那我想我不明白你怎么不知道所有请求是否都完成了
-
实际上应该由您提供您正在尝试的代码,而不是 Selvin...
标签: java android http android-asynctask sync