有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java扩展异步任务<Void,Void,Void>

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

  1. 这是AsyncTask的正确用法吗
  2. 如果是,我可以扩展AsyncTask吗
  3. 扩展AsyncTaskAsyncTask<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;    
    }
}

谢谢


共 (4) 个答案

  1. # 1 楼答案

    类可以被认为是一种非常方便的线程机制。它提供了一些简单Java线程所没有的工具,比如on cancel cleanup操作。你不必在后台做任何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,这是所有事物的基准类

  2. # 2 楼答案

    (I have no use in performing any UI in this class)

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

    Runnable r = new Runnable()
    {
        @Override
        public void run()
        {
            // your code here
        }
    };
    
    Thread t = new Thread(r);
    t.start();
    
  3. # 3 楼答案

    1. 这是asynctask的正确用法吗

    我认为没有任何适当的用途。您可以使用asynctask在后台线程上执行密集操作,并在主线程上发布结果和更新。您不必发布结果或进度。这是给你的。你的决定

    但对于网络操作,也可以使用线程。但后来您决定在主线程上发布结果和进度,Asynctask将以一种简单的方式帮助您

    线程不会

    Asynctask使用通用数据类型作为参数。你必须提供它。如果您不想从asyctask提供或接受任何数据。你可以使用Void类型

    就像下面给出的一样

    class MessagePooling extends AsyncTask<Void,Void,Void>
    

    这意味着asynctask不会得到任何参数,不会给你任何进展或结果

    有关asynctask的详细信息:http://androidride.com/beginners-guide-asynctask-android-tutorial-example/

  4. # 4 楼答案

    Is this proper use of AsyncTask ?

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

    What is the difference between extending AsyncTask and AsyncTask

    AsyncTask是泛型类型,您应该使用泛型,因为它们的代码速度更快,类型更安全

    I have no use in performing any UI

    因此,您可以使用Handler或经典的Runnable接口,基本上只能使用辅助线程


    注意:一般来说,使用泛型类型可以使代码更快、更安全。 另一个优点是编译源代码时的强类型检查、显式转换的限制等