扩展AsyncTask <Void,Void,Void>
在我的Android应用程序中,我通过扩展AsyncTask<Void, Void, Void>
类在doInBackground
执行一些操作。 (我没有用这个类来执行任何UI)
- 这是AsyncTask的正确使用吗?
- 如果是的话,我可以扩展AsyncTask吗?
- 扩展
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; } }
谢谢
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检查,显式转换的限制等。