扩展AsyncTask


问题内容

在我的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;
    }
}

要么:

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线程上需要的某些内容,在这种情况下,您将覆盖其他方法。其他情况是,您只是没有采取足够的行动来证明编写另一个类是合理的,因此只需动态创建一个类并使用它即可完成。

编辑:

回答#3:它们实际上是相同的。Void就像其他对象一样,该对象是Java对象。您没有使用Void,因此在该位置使用的内容无关紧要。只是AsyncTask合同需要传入三种类类型,默认情况下,它们是Object所有内容的基础类。