扩展AsyncTask <Void,Void,Void>

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

  1. 这是AsyncTask的正确使用吗?
  2. 如果是的话,我可以扩展AsyncTask吗?
  3. 扩展AsyncTaskAsyncTask<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; } } 

谢谢

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线程所需的东西,在这种情况下,您可以重写其他方法。 其他情况下,你只是不采取足够的行动来certificate另外一个class的理由,所以只要立即创build一个,并完成它。

编辑:

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

(我没有用这个类来执行任何UI)

然后,只需使用正常的Thread类而不是使用AsyncTask类来处理线程生命周期中的UI更改:

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

这是AsyncTask的正确使用吗?

你不说你的目标是什么。 但AsyncTask通常用于长时间的任务,并在工作中更新UI,以通知某些长时间工作的进度变化。 这也是非常有效的,types安全的工具,比Handler更复杂。

扩展AsyncTask和AsyncTask有什么区别?

AsyncTask是genericstypes,你应该使用它们的generics代码更快,更安全。

我没有使用任何用户界面

所以你可以使用Handler或经典的Runnable接口,你基本上只能使用工作线程。

注意:通常,使用genericstypes可以使代码更快速,最安全。 另一个好处是在编译源代码时强types检查,显式转换的限制等。