Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 异步任务';调用AsyncTask::execute后,s doInBackground开始执行太晚_Android_Android Asynctask - Fatal编程技术网

Android 异步任务';调用AsyncTask::execute后,s doInBackground开始执行太晚

Android 异步任务';调用AsyncTask::execute后,s doInBackground开始执行太晚,android,android-asynctask,Android,Android Asynctask,我编写了一个AsyncTask,在大多数情况下,调用它的构造函数和调用它的doInBackground之间没有延迟(0毫秒延迟)。 但是,每当联系人同步发生在后台时,我经常会在AsyncTasks的构造函数和doInBackground之间经历1-3秒的延迟。在我的情况下,这种拖延是不能接受的。 我知道AsyncTask是一个后台线程,这个问题可以通过使用线程并将其优先级设置得更高来解决。但我想知道的是,我如何知道是什么原因导致我的AsyncTask在后台被调用? 我使用了ADBShellTop

我编写了一个AsyncTask,在大多数情况下,调用它的构造函数和调用它的doInBackground之间没有延迟(0毫秒延迟)。 但是,每当联系人同步发生在后台时,我经常会在AsyncTasks的构造函数和doInBackground之间经历1-3秒的延迟。在我的情况下,这种拖延是不能接受的。 我知道AsyncTask是一个后台线程,这个问题可以通过使用线程并将其优先级设置得更高来解决。但我想知道的是,我如何知道是什么原因导致我的AsyncTask在后台被调用? 我使用了ADBShellTop-M10,当这个问题发生时,进程的使用似乎很正常

感谢您的帮助


谢谢

我们通常不关心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
启动前不再延迟