Android:RunOnUiThread vs AsyncTask

jcl*_*ova 36 performance multithreading android android-asynctask

我相信Google建议开发人员使用AsyncTask.但是,我想知道它与使用"新线程"然后在性能和内存效率方面调用"RunOnUiThread"有何不同.

使用RunOnUithread的示例:

    // some code #1
    Thread t = new Thread("Thread1") {
        @Override
        public void run() {
            // some code #2
            runOnUiThread(new Runnable() {
                public void run() {
                    // some code #3 (that needs to be ran in UI thread)

                }
            });

        }
    };
    t.start();
Run Code Online (Sandbox Code Playgroud)

的AsyncTask:

onPreExecute() {
   // some code #1
}

doInBackground() {
   // some code #2
}

onPostExecute() {
   // some code #3
}
Run Code Online (Sandbox Code Playgroud)

有什么优点/缺点?

编辑:

我不是在寻找像'更容易看到代码','方便开发人员'等答案.我实际上是在寻找幕后的技术差异.

例如,Paul Nikonowicz在下面的回答就是我想要的答案.(但AsyncTask的行为相同)

Ran*_*ku' 52

当你使用时new Thread,每次执行时都会创建一个新线程.AsyncTask但是,使用最多128个线程的静态池,并且只要它存在就会重用旧线程.因此,在串行中运行AsyncTask 10次只会创建一个运行任务10次而不是10个线程的线程.

这是许多人之间的差异之一.

  • @songyy https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java#L181 - 始终运行的5个核心线程,128个线程的上限.如果存在多于5个线程,则如果它们空闲超过一秒钟将被杀死. (6认同)
  • 谢谢.我想听到的东西.如果您知道其他一些差异,我想知道.另外,你怎么知道AsyncTask有一个最多128个线程的静态池? (4认同)
  • 是的..您怎么知道AsyncTask有128个线程的静态池..? (2认同)

Bri*_*uis 13

基本上这是一种便利.该AsyncTask框架涉及管理Thread池并提供简单易懂的界面.这是众所周知的-由那些知道如何使用AsyncTask-这UI活动在继续onPreExecute(),onPostExecute()并且onProgressUpdate(),所有的"繁重"的在做doInBackground(),你不能碰的UI.

它使开发人员可以轻松地拥有一个简单的后台任务,可以轻松地将更新发布到UI线程并在完成后返回结果.这不是魔术,它只是一种便利.


Joo*_*ong 5

根据这个AsyncTask更容易使用,但像下面这样一些限制:

  • 核心池大小和工作队列是固定的:5个池/ 10个元素
    • 它是硬编码的,不能更改
  • 线程优先级固定为
  • 异常处理的支持不如 Thread

另外,我还没有发现另一个差异。由于Android是开源的,因此您可以找到并检查AsyncTask的完整源代码:-)

祝您在Android中编码愉快!