Android 创建异步任务花费了太多时间

Android 创建异步任务花费了太多时间,android,android-asynctask,Android,Android Asynctask,我正在AsyncTask中进行网络调用,但我面临的问题是启动doInBackground方法所需的时间 以下是我代码的一部分: button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("Temp:",System.currentTimeMillis()+"");

我正在AsyncTask中进行网络调用,但我面临的问题是启动doInBackground方法所需的时间

以下是我代码的一部分:

    button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("Temp:",System.currentTimeMillis()+"");
                new Move().execute();
                /*some other logic
            }
    }
我的任务是:

    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;
    }
}
所以实际上,在doInBackground方法中,到达第一行几乎需要29秒,因为完成网络呼叫只需要36毫秒。我试了很多次,所花的时间几乎是一样的

是否可以立即启动异步任务?或者有没有其他方法可以解决这个问题(除了运行一个简单的线程?)
谢谢:)

如果您有任何其他任务正在运行,则
异步任务
正在等待其他
异步任务
完成运行(请检查是否运行)

执行顺序

首次引入时,异步任务是在单个后台线程上串行执行的。从DONUT开始,它被更改为一个线程池,允许多个任务并行运行。从蜂巢开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误

如果确实需要并行执行,可以使用线程池执行器调用executeOnExecutor(java.util.concurrent.Executor,Object[])


如果同时执行另一个AsyncTask,则您的AsyncTask可能正在等待前一个AsyncTask完成。但是,您可以强制异步任务在多线程中启动

 Move task = new Move();
 if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 else
    task.execute();

希望这对您有所帮助,有关更多信息,您可以阅读此有用的

您在/*其他逻辑*中有什么?您是否尝试对其进行评论并再次测试?您有onPostExecute覆盖吗?理想情况下,我所谓的“其他一些逻辑”不应该影响AsyncTask,对吗?因为它们现在是两个不同的线程。顺便说一下,我只是在逻辑部分做一些计算。为什么您的Move实例没有()括号?您是否可以这样实例化它:new Move().execute()?在最近的androud版本中,AsyncTasks在用于此目的的单个线程上按顺序执行,因此它们可以相互阻止-但您可以更改这种行为。@在实际代码中可能没有语法错误,只是忘了在此处编写。Thanx很多:)。。。。。。这正是在将其更改为在不同线程中执行后发生的情况。几位女士只花了29秒。谢谢,这很有帮助
 Move task = new Move();
 if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 else
    task.execute();