扩展AsyncTask <void,void,=“”void =“”> </void,>

时间:2012-06-25 17:56:41

标签: java android

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

  1. 是否正确使用AsyncTask?
  2. 如果可以,我可以扩展AsyncTask吗?
  3. 延长AsyncTaskAsyncTask<Void, Void, Void>
  4. 之间的区别

    代码示例:

    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 个答案:

答案 0 :(得分:55)

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,它是所有内容的基线类。

答案 1 :(得分:16)

  

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

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

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

Thread t = new Thread(r);
t.start();

答案 2 :(得分:3)

  

这是否正确使用了AsyncTask?

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

  

扩展AsyncTask和AsyncTask

之间有什么区别

AsyncTask是泛型类型,您应该使用泛型,代码更快,类型更安全。

  

我没有用于执行任何UI

所以你宁愿使用Handler或经典的Runnable接口,你只能使用工作线程。


注意:通常,使用泛型类型可以使代码更快,大多数类型安全。 另外一个优点是在编译源代码中强类型检查,显式转换的限制等。

答案 3 :(得分:0)

  1. 是否正确使用了asynctask?

我认为没有任何适当的用途。您可以使用asynctask在后台线程上执行大量操作,并在主线程上发布结果和更新。您不一定要发布结果或进度。那是给你的。您的决定。

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

线程没有。

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

就像下面给出的

class MessagePooling extends AsyncTask<Void,Void,Void>

这意味着asynctask不会得到任何参数,不会给您带来任何进展或结果。

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