Java 这个任务非常慢
我有一个非常简单的应用程序,主要的威胁是启动2个异步任务。这两个异步任务几乎相同,这是我的一个异步任务的代码:Java 这个任务非常慢,java,android,garbage-collection,android-asynctask,Java,Android,Garbage Collection,Android Asynctask,我有一个非常简单的应用程序,主要的威胁是启动2个异步任务。这两个异步任务几乎相同,这是我的一个异步任务的代码: private class waitPlayer extends AsyncTask<Integer, Integer, Void> { @Override protected Void doInBackground(Integer... params) { try { Thread
private class waitPlayer extends AsyncTask<Integer, Integer, Void> {
@Override
protected Void doInBackground(Integer... params) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
CreateLog.addToLog(e.toString);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// Update your layout here
super.onPostExecute(result);
setCanPlay(true, lastPlayerPlayed);
}
@Override
protected void onProgressUpdate(Integer... progress) {
//progress_p1.setProgress((int) progress[0]);
//progress_p2.setProgress((int) progress[0]);
}
}
在这项工作中存在着极大的愚蠢。从开发文档中引用: 首次引入时,AsyncTasks是在单个后台线程上串行执行的。从DONUT开始,它被更改为允许多个任务并行运行的线程池。从Honeycous开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误 如果确实需要并行执行,可以使用线程池执行器调用executeOnExecutor(java.util.concurrent.Executor,Object[])
这意味着在AsyncTask::doInBackground中睡眠将阻止所有其他AsyncTask运行,直到睡眠完成。您很可能正在阻止其他后台活动(可能是系统库活动)完成。如果您希望在不久的将来做些什么,可以使用或 例如: 这将在大约2秒钟内运行runnable:
new Handler().postDelayed(new Runnable() {...} , 2000);
asyncTask仅用于小任务,您不关心任务完成的顺序,也不关心有多少线程在处理这些任务
例如,它们可用于从internet下载小图像,如果在滚动过快的listview中使用,则会被取消
在任何情况下,我们都需要看到您的代码:什么是“setCanPlay”?对另一个异步任务的调用在哪里?我发现问题在于=> AsyncTask类使用串行通道在android的新版本(如jellybean版本=>4.2)上编译应用程序 与旧版本不同,如Eclair版本=>2.0 它使用一个并行通道来编译AsyncTask,因此如果您在旧版本上尝试应用程序 就像我做的那样,你会看到不同的 如果你想解决这个问题,这将帮助你:- 援引
使用“为什么不将处理程序与postdelayed一起使用?我从未使用过处理程序,所以我使用了AsyncTask。您如何调用/启动这两个AsyncTask?什么是
setCanPlay()
?你说第二个任务与发布的任务不同。第二个在干什么?我也推荐一个训练员,就像拉格哈夫建议的那样。也不要从调试器开始,因为调试器会显著降低应用程序的性能。谢谢,我不知道这一点。这很有帮助!这不是极大的愚蠢。如果您希望任务并行运行,只需使用executeOnExecutor(如您所说)。不过,在大多数情况下,人们希望如果在AT2.execute()之前调用AT1.execute(),那么AT1将在AT2之前运行。他们发现,在甜甜圈和蜂窝之间,在未加工的线程池执行器上,他们不一定会这样做。如果你带着甜甜圈或更晚的时间来参加聚会,并且正确地写下了你的东西,发现它在蜂窝上坏了会有点震惊。我想,如果你在较早的版本上使用android,发现自己的东西被甜甜圈弄坏了,情况也是如此。两个相互抵消的傻瓜是否构成了非愚蠢?不确定。我仍然觉得有点奇怪,一个Android开发人员竟然自己单方面决定所有使用API的人都做了错事。谢谢,这对我帮助很大!
new Handler().postDelayed(new Runnable() {...} , 2000);