我正在AsyncTask中进行网络调用,但我遇到的问题是启动doInBackground方法所花费的时间。
以下是我的代码的一部分:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Temp:",System.currentTimeMillis()+"");
new Move().execute();
/*some other logic
}
}
我的AsyncTask是:
private class Move extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... temp) {
Log.d("start:",System.currentTimeMillis()+"");
gson.fromJson(Web.Request.get(some_URL),Void.class);
Log.d("end:",System.currentTimeMillis()+"");
return null;
}
}
这些是我得到的日志:
32658-998/com.example.game D/temp:﹕ 1408923006159
32658-998/com.example.game D/start:﹕ 1408923035163
32658-998/com.example.game D/end:﹕ 1408923035199
实际上,在doInBackground方法中到达第一行几乎需要29秒,因为完成网络调用只花了36毫秒。我尝试了很多次,所用的时间几乎是一样的。
是否可以立即启动AsyncTask?或者有没有其他方法来解决这个问题。(除了运行一个简单的线程?) 谢谢:))
答案 0 :(得分:10)
如果您正在运行任何其他任务,AsyncTask
正在等待其他AsyncTask
完成运行(请检查您是否这样做)。
请参阅here。
执行顺序
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。
答案 1 :(得分:7)
如果您同时执行另一个AsyncTask,您的AsyncTask可能正在等待前一个完成。但是,您可以强制AsyncTasks在多线程中启动
Move task = new Move();
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
task.execute();
希望对您有所帮助,有关详细信息,请阅读此有用的topic