2

我有一个类AsycnIntegerCounter,它扩展AsyncTask了,doInBackground()并被onPostExecute()覆盖了。从我的主线程中,我可以创建一个可运行对象并使用 AsycnIntegerCounter的静态执行方法执行它。 AsycnIntegerCounter.execute(Runnable)

AsycnIntegerCounter任何人都可以帮助我理解当我们使用(即)使用AsycnTask对象执行可运行时究竟会发生什么。

这个什么时候可以用?而不是使用 Thread 对象运行有什么优势?

代码示例:

AsycnIntegerCounter integerCounter1 = new AsycnIntegerCounter(next,0);

AsycnIntegerCounter.execute(new Runnable() {

            @Override
            public void run() {

                int i = 100;
                while(i<=105){

                    i++;
                    try {
                        Thread.sleep(1000);

                    } catch (InterruptedException e) {

                        e.printStackTrace();
                    }
                }
            }
        });
4

4 回答 4

4

两者之间有几个根本区别

static void execute(Runnable)


AsyncTask execute(Params...)
  1. 后台任务在 Runnable 中定义而不是实现doInBackground
  2. -taskRunnable没有使用AsyncTask. 因此,既不onPreExecute也不onPostExecute被调用。
  3. 后者在所有平台上都可用,而第一个是在 API 级别 11 中添加的。

使用的好处execute(Runnable)是任务可以在内部线程池的工作线程上执行,即不必创建新线程。

于 2013-07-14T04:06:38.073 回答
2

它是一样的,execute()但它会Runnable在后台运行你而不是运行doInBackround函数。当您具有相同的 onPreExecute 和 onPostExecute 但有多个可运行文件时,它会很有用。

Thread.execute我猜对or an的优势Executor就是在调用之前onPreExecuteonPostExecute之后。

于 2013-07-13T08:48:34.087 回答
1

@Alex 提出了一个很好的观点。假设您有很多方法、M1()M2()等要执行。假设在执行其中任何一个之前,您需要执行方法Before(),之后您需要执行方法After()

即,方法的顺序是:

Before();
M1();
After();

或者

Before();
M2();
After();

通过投入和投入,Before()您可以实现该顺序。通过制作可运行文件,您可以实现:onPreExecuteAfter()onPostExecuteM

Before();
WhateverRunnableYouWant();
After();

根据Runnable您的代码,在后台、非 UI 线程中。

于 2013-07-13T09:52:05.443 回答
1

据我所知,它就像AsyncTask类,但AsynchTask只运行一次,但是对于这个类,它提供了两件事-:

  1. 如果您希望任务多次运行(例如检查 Web 服务上的连续数据),它会循环使用。
  2. 它使用 Thread.sleep 修复了任务的运行时间,因此如果任务较早完成,它将修复该任务的时间Thread.wait()
于 2013-07-13T09:09:32.847 回答