java扩展异步任务<Void,Void,Void>
在我的安卓应用程序中,我通过扩展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;
}
}
谢谢
# 1 楼答案
类可以被认为是一种非常方便的线程机制。它提供了一些简单Java线程所没有的工具,比如on cancel cleanup操作。你不必在后台做任何UI。您只需将一个作为匿名类编写即可执行一个,如下所示:
它将使用给定的参数在后台线程上执行
doInBackground
中的任何内容。同样地,您可以简单地使用Void
并且不带参数地执行我所能想到的以这种方式执行线程的唯一优点是有助于将来的维护。在某种情况下,您可能希望修改UI线程上需要的某些内容,在这种情况下,您将覆盖其他方法。其他情况可能是,你只是没有做足够的动作来证明写出另一个类是合理的,所以只需在运行中创建一个类就可以了
编辑:
回答#3:它们实际上是一样的。与其他对象一样,
Void
对象也是Java对象。你没有使用Void
,所以你在它的位置上使用什么并不重要。只是AsyncTask
契约需要传入三种类类型,默认情况下它们是Object
,这是所有事物的基准类# 2 楼答案
然后只需使用普通的
Thread
类,而不是使用AsyncTask
类,该类用于处理线程生命周期内的UI更改:# 3 楼答案
我认为没有任何适当的用途。您可以使用asynctask在后台线程上执行密集操作,并在主线程上发布结果和更新。您不必发布结果或进度。这是给你的。你的决定
但对于网络操作,也可以使用线程。但后来您决定在主线程上发布结果和进度,Asynctask将以一种简单的方式帮助您
线程不会
Asynctask使用通用数据类型作为参数。你必须提供它。如果您不想从asyctask提供或接受任何数据。你可以使用Void类型
就像下面给出的一样
这意味着asynctask不会得到任何参数,不会给你任何进展或结果
有关asynctask的详细信息:http://androidride.com/beginners-guide-asynctask-android-tutorial-example/
# 4 楼答案
你没说你的目标是什么。但AsyncTask通常用于长任务,并在工作期间准确地更新UI,以通知一些长任务的进度变化。它也是一个非常高效、类型安全的工具,比Handler更复杂
AsyncTask是泛型类型,您应该使用泛型,因为它们的代码速度更快,类型更安全
因此,您可以使用
Handler
或经典的Runnable
接口,基本上只能使用辅助线程注意:一般来说,使用泛型类型可以使代码更快、更安全。 另一个优点是编译源代码时的强类型检查、显式转换的限制等