扩展AsyncTask <Void,Void,Void>

Ram*_*ami 42 java android

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

  1. 这是正确使用AsyncTask吗?
  2. 如果是这样,我可以扩展AsyncTask吗?
  3. 扩展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;
    }
}
Run Code Online (Sandbox Code Playgroud)

要么:

public class MessagePooling extends AsyncTask
{
    @Override
    protected Object doInBackground(Object... params) 
    {
        while (!isCancelled()) 
        {           
           //Getting data from server            
            SystemClock.sleep(1000);
        }
        return null;    
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Dee*_*eeV 58

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

    new AsyncTask<Integer, Void, Void>(){
        @Override
        protected Void doInBackground(Integer... params) {
            // **Code**
            return null;
        }
    }.execute(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

它将doInBackground使用给定参数执行您在后台线程中放入的任何内容.同样,您可以简单地使用Void和执行没有参数.

我能想到以这种方式执行线程的唯一优势是有助于将来的维护.可能存在您想要修改UI线程上必需的某些内容的情况,在这种情况下,您将覆盖其他方法.其他情况是你只是不做足够的动作来证明写出另一个类,所以只需动态创建一个并完成它.

编辑:

回答#3:它们实际上是一样的.该Void对象就像其他任何东西一样是Java对象.你没有使用Void,所以你在它的地方使用并不重要.只是AsyncTask合同需要传入三种类类型,默认情况下它们是Object所有内容的基线类.


Eng*_*uad 16

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

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

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

Thread t = new Thread(r);
t.start();
Run Code Online (Sandbox Code Playgroud)

  • 这是对的.AsyncTask只是一个包装线程,可以更轻松地编写与UI交互的后台任务.如果OP没有处理UI,那么直接处理线程是有意义的. (3认同)