【问题标题】:doInBackground takes long to startdoInBackground 需要很长时间才能启动
【发布时间】:2013-11-15 17:00:55
【问题描述】:

有谁知道为什么 doInBackground 需要很长时间才能启动?这是一个例子:

runDoInBackground(){
   print("starting task");
   new MyAsyncTask(someObject,otherObject).execute((Void)null);
}

private class MyAsyncTask extends<Void,Void,Integer>{
   SomeObject someObject;
   OtherObject otherObject;

   public MyAsyncTask(SomeObject someObject, OtherObject otherObject){
      this.someObject=someObject;
      this.otherObject = otherObject;
   }

   @Override
   protected Integer doInBackground(Void... params) {
      print("start background run")
      ... work ... get from server ...
   }

}

如果运行缓慢的原因是其他干扰线程(我对此表示怀疑),我该如何给这个最高优先级?

【问题讨论】:

  • 你怎么知道它很慢?
  • 您在哪里看到“打印”语句?我实际上正在使用 system.out.println 进行日志记录,只是为了看看需要多长时间。在第一个 print 语句之后,需要很长时间才能看到第二个 print 语句。
  • 时差是多少?
  • 所有异步任务默认使用相同的执行器 (developer.android.com/reference/android/os/…),如果有任务需要时间
  • private class MyAsyncTask extends&lt;Void,Void,Integer&gt;{... 这不应该是private class MyAsyncTask extends AsyncTask&lt;Void,Void,Integer&gt;{ 吗?

标签: java android multithreading android-asynctask


【解决方案1】:

这确实取决于您拥有的 AsyncTask 执行方式的 Android 版本。它们在 API5 (2.0) - API 10 (2.3.3) 上并行执行。从 API 11 开始,它们默认再次串行执行。正如 zapl 提到的,你必须打电话给

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void)null);

让它们再次并行运行。

【讨论】:

  • 评论后我改成那个了。所以一个问题(也许很明显)。如果我有多个 AsyncTask 并且每个都指定 AsyncTask.THREAD_POOL_EXECUTOR,我应该假设它们都使用同一个线程池,对吧?
  • 是的 - 但是池确实包含多个线程,甚至可以根据需要创建新的线程,达到一定数量。