在我的Android应用程序中,我发现我的所有api调用都在排队而不是同时发生。我假设他们都被发布到同一个帖子中,而我的印象是AsyncTask
为doInBackground()
创建了新的主题。
public class API extends AsyncTask<String, String, String> {
public interface Listener {
void completedWithResult(JSONObject result);
}
public Listener listener;
@Override
protected String doInBackground(String... strings) {
if(!canMakeRequest()){
return internetError().toString();
}
String action = strings[0];
Log.i("API", action +" Sent");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("API", action +" Received");
return "";
}
@Override
protected void onPostExecute(String json) {
JSONObject obj;
obj = new JSONObject(json);
if(listener != null)listener.completedWithResult(obj);
}
}
在我的应用程序的一大堆地方,我有类似的东西:
API api = new API();
api.listener = new API.Listener() {
@Override
public void completedWithResult(JSONObject result) {
Log.i(tag, "Returned with "+result);
}
};
api.execute("update-address/");
我总是创建一个API
的新实例,但我的日志中所有这些调用都是串行发生而不是并行:
analytics/log/ Sent
analytics/log/ Returned
get-beta-tester Sent
get-beta-tester Returned
get-following Sent
get-following Returned
get-groups Sent
get-groups Returned
get-follow-requests Sent
get-follow-requests Returned
get-followers Sent
get-followers Returned
analytics/log/ Sent
analytics/log/ Returned
analytics/log/ Sent
analytics/log/ Returned
post-session Sent
post-session Returned
analytics/log/ Sent
analytics/log/ Returned
post-session Sent
post-session Returned
analytics/log/ Sent
analytics/log/ Returned
analytics/log/ Sent
analytics/log/ Returned
unregister-GCM Sent
unregister-GCM Returned
analytics/log/ Sent
analytics/log/ Returned
verify Sent
verify Returned
答案 0 :(得分:1)
见这里:
https://developer.android.com/reference/android/os/AsyncTask.html
首次引入时,AsyncTasks在单个上串行执行 背景线程。从DONUT开始,这被改成了一个池 允许多个任务并行运行的线程。 从开始 HONEYCOMB,任务在单个线程上执行 以避免常见 并行执行导致的应用程序错误。
,解决方案是:
如果您真的想要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,Object [])with THREAD_POOL_EXECUTOR。
api.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "update-address/");
答案 1 :(得分:1)
调用execute
使AsyncTasks在单个后台线程上串行执行。
执行顺序
首次引入时,AsyncTasks在单个上串行执行 背景线程。从DONUT开始,这被改成了一个池 允许多个任务并行运行的线程。从...开始 HONEYCOMB,任务在单个线程上执行以避免常见 并行执行导致的应用程序错误。
如果您真的想要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,Object [])with THREAD_POOL_EXECUTOR。
所有这些混乱是我停止使用AsyncTask的原因之一。
答案 2 :(得分:0)
即使我想与你的相同,也尝试过AsyncTask。后来了解了Executors Thread Pool。我建议你使用ThreadPool,它将同时发生,你可以管理正在创建的线程。
//Sample snapshot
ExecutorService pool = Executors.newCachedThreadPool();//or fixed thread pool
pool.execute(new Runnable() {
@Override
public void run() {
//Do your tasks
}
});
这会对您有帮助,ThreadPoolExecutor