42

在我的 android 应用程序中,我正在doInBackground通过扩展AsyncTask<Void, Void, Void>类执行一些操作。(我在这个类中执行任何 UI 都没有用)

  1. 这是正确使用 AsyncTask 吗?
  2. 如果是这样,我可以改为扩展 AsyncTask 吗?
  3. AsyncTask扩展和扩展有什么区别AsyncTask<Void, Void, Void>

代码示例:

public class MessagePooling extends AsyncTask<Void, Void, Void>
{        
    @Override
    protected Void doInBackground(Void... params) 
    {
        while (!isCancelled()) 
        {           
           //Getting data from server            
            SystemClock.sleep(1000);
        }
        return null;
    }
}

或者:

public class MessagePooling extends AsyncTask
{
    @Override
    protected Object doInBackground(Object... params) 
    {
        while (!isCancelled()) 
        {           
           //Getting data from server            
            SystemClock.sleep(1000);
        }
        return null;    
    }
}

谢谢

4

4 回答 4

57

该类AsyncTask可以被认为是一种非常方便的线程机制。它为您提供了一些工具,您可以使用这些简单的 Java 线程根本没有的工具,例如取消清理操作。您不必在后台执行任何 UI。您可以简单地通过将一个编写为匿名类来执行一个,如下所示:

    new AsyncTask<Integer, Void, Void>(){
        @Override
        protected Void doInBackground(Integer... params) {
            // **Code**
            return null;
        }
    }.execute(1, 2, 3, 4, 5);

它将doInBackground使用给定的参数执行您在后台线程中输入的任何内容。同样,您可以简单地使用Void和执行不带参数的操作。

我能想到以这种方式执行线程的唯一优点是有助于将来的维护。在某些情况下,您可能想要修改 UI 线程上需要的某些内容,在这种情况下,您将覆盖其他方法。其他情况是你根本没有做足够的动作来证明写出另一个类是合理的,所以只需动态创建一个并完成它。

编辑:

回答#3:它们实际上是相同的。该Void对象是一个Java 对象,就像其他任何东西一样。你没有使用Void,所以你在它的地方使用什么并不重要。只是AsyncTask合约需要传入三种类类型,默认情况下它们是Object所有东西的基线类。

于 2012-06-25T18:12:26.350 回答
16

(我在这个类中执行任何 UI 都没有用)

然后只使用普通Thread类而不是使用AsyncTask专为在线程生命周期内处理 UI 更改而设计的类:

Runnable r = new Runnable()
{
    @Override
    public void run()
    {
        // your code here
    }
};

Thread t = new Thread(r);
t.start();
于 2012-06-25T18:00:27.767 回答
3

这是正确使用 AsyncTask 吗?

你没有说你的目标是什么。但 AsyncTask 一般用于长任务,工作时更新 UI 来准确通知一些长时间工作的一些进度变化。它也是非常高效、类型安全的工具,并且比 Handler 更复杂。

扩展 AsyncTask 和 AsyncTask 有什么区别

AsyncTask 是泛型类型,您应该将泛型与它们一起使用,这样代码会更快、更安全。

我在执行任何 UI 时都没有用

因此,您宁愿使用Handler经典Runnable接口,并且基本上只能使用工作线程。


注意:通常,使用泛型类型可以使代码更快,最安全。下一个优点是编译源代码时的强类型检查、显式转换的限制等。

于 2012-06-25T18:01:30.790 回答
0
  1. 这是正确使用异步任务吗?

我认为没有任何适当的用途。您可以使用 asynctask 在后台线程上执行密集操作并在主线程上发布结果、更新。您必须发布结果或进度不是强制性的。那是给你的。你的决定。

但是对于您的网络操作,您也可以使用线程。但是后来您决定在主线程上发布结果和进度,Asynctask 将以简单的方式帮助您。

线程没有。

Asynctask 使用通用数据类型作为参数。你必须提供它。如果您不想提供或接受来自 asyctask 的任何数据。您可以使用 Void 类型,

就像下面给出的

class MessagePooling extends AsyncTask<Void,Void,Void>

这意味着 asynctask 不会获得任何参数,不会给您任何进度或结果。

有关 asynctask 的更多信息:http ://androidride.com/beginners-guide-asynctask-android-tutorial-example/

于 2018-07-12T16:47:07.777 回答