Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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
Java 这个任务非常慢_Java_Android_Garbage Collection_Android Asynctask - Fatal编程技术网

Java 这个任务非常慢

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

我有一个非常简单的应用程序,主要的威胁是启动2个异步任务。这两个异步任务几乎相同,这是我的一个异步任务的代码:

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);