Android 异步任务';调用AsyncTask::execute后,s doInBackground开始执行太晚
我编写了一个AsyncTask,在大多数情况下,调用它的构造函数和调用它的doInBackground之间没有延迟(0毫秒延迟)。 但是,每当联系人同步发生在后台时,我经常会在AsyncTasks的构造函数和doInBackground之间经历1-3秒的延迟。在我的情况下,这种拖延是不能接受的。 我知道AsyncTask是一个后台线程,这个问题可以通过使用线程并将其优先级设置得更高来解决。但我想知道的是,我如何知道是什么原因导致我的AsyncTask在后台被调用? 我使用了ADBShellTop-M10,当这个问题发生时,进程的使用似乎很正常 感谢您的帮助Android 异步任务';调用AsyncTask::execute后,s doInBackground开始执行太晚,android,android-asynctask,Android,Android Asynctask,我编写了一个AsyncTask,在大多数情况下,调用它的构造函数和调用它的doInBackground之间没有延迟(0毫秒延迟)。 但是,每当联系人同步发生在后台时,我经常会在AsyncTasks的构造函数和doInBackground之间经历1-3秒的延迟。在我的情况下,这种拖延是不能接受的。 我知道AsyncTask是一个后台线程,这个问题可以通过使用线程并将其优先级设置得更高来解决。但我想知道的是,我如何知道是什么原因导致我的AsyncTask在后台被调用? 我使用了ADBShellTop
谢谢我们通常不关心jvm的任务调度。事实上,我们也不需要麻烦 如果需要在应用程序中尽可能快地完成某些操作,请在构造函数中完成,或者使用Asynctask的onPre(记住它在UI线程上执行) 但我同意在DoinBackground调用Android异步任务时有些可疑 我亲眼目睹了doInbackground在onPre之后没有接到电话。你也可以用谷歌搜索。许多人都面对过。 我开始使用传统的线
我在内核中使用传统线程编写了自己的异步任务,并模仿了我使用的处理程序onPre和onPost。你也可以选择这个选项 区分创建和执行任务很重要。(正如您所注意到的,
ASyncTask
有一个单独的execute()
方法和一个构造函数。)
创建线程的成本可能相当高,因此您可能会发现,提前创建任务,然后只在正确的时间执行任务,可以获得更好的结果
如果后台操作可能经常重复,您可能还会发现在后台线程中一次处理一个请求的
IntentService
更合适。我也长期面临这个问题,但现在它已经解决了。使用下面的代码
new AsyncTaskName().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
取而代之的是代码
new AsyncTaskName().execute();
它可以解决延迟运行doInbackground的问题。IMO,通常它会立即执行,如果还有另一个线程也在运行,则会使它延迟,因此最好检查您的线程并很好地同步它们。这对我来说非常有效。请注意,这是在api 11中添加的,警告来自:
http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutorjava.util.concurrent.Executor,Params…
必须注意,executeOnExecutor不能与早于11的API版本一起使用。看,这对我有用。我要补充的是,我们可以使用support-v4 lib中的AsyncTaskCompat.executeParallel()对所有API版本执行此操作。它处理两种情况:从API 11+开始,我们需要手动选择线程池执行器,但在API 11之前,所有任务都是并行运行的。这不就是并行运行吗?它带有警告功能,太棒了!doInBackground
启动前不再延迟