创建AsyncTask需要花费太多时间Android

时间:2014-08-25 00:49:47

标签: android android-asynctask

我正在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?或者有没有其他方法来解决这个问题。(除了运行一个简单的线程?) 谢谢:))

2 个答案:

答案 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