首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展AsyncTask<Void、Void、Void>

扩展AsyncTask<Void、Void、Void>
EN

Stack Overflow用户
提问于 2012-06-25 17:56:41
回答 4查看 81.8K关注 0票数 42

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

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

代码示例:

代码语言:javascript
复制
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;
    }
}

或者:

代码语言:javascript
复制
public class MessagePooling extends AsyncTask
{
    @Override
    protected Object doInBackground(Object... params) 
    {
        while (!isCancelled()) 
        {           
           //Getting data from server            
            SystemClock.sleep(1000);
        }
        return null;    
    }
}

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-25 18:12:26

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

代码语言:javascript
复制
    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,它是所有事物的基线类。

票数 57
EN

Stack Overflow用户

发布于 2012-06-25 18:00:27

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

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

代码语言:javascript
复制
Runnable r = new Runnable()
{
    @Override
    public void run()
    {
        // your code here
    }
};

Thread t = new Thread(r);
t.start();
票数 16
EN

Stack Overflow用户

发布于 2012-06-25 18:01:30

这是AsyncTask的正确使用吗?

你没说你的目标是什么。但是,AsyncTask通常用于长任务和在工作期间更新UI,以准确地通知某些长时间工作的某些进度更改。它也是非常高效的,类型安全的工具,并且比Handler更复杂。

扩展AsyncTask和AsyncTask有什么区别?

AsyncTask是泛型类型,您应该与它们一起使用泛型是代码更快、更类型安全.

我对执行任何UI都没有用。

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

注意:一般情况下,使用泛型类型可以使代码更快、最安全.另一个优势是编译源代码的类型检查能力强,对显式转换的限制等等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11194663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档