Подтвердить что ты не робот

Расширение AsyncTask <Пустота, Пустота, Пустотa>

В моем приложении Android я выполняю некоторые операции в doInBackground, расширяя класс AsyncTask<Void, Void, Void>. (Я не могу использовать какой-либо пользовательский интерфейс в этом классе)

  • Это правильное использование 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;    
    }
}

Спасибо

4b9b3361

Ответ 1

Класс AsyncTask можно рассматривать как очень удобный механизм потоковой передачи. Это дает вам несколько инструментов, которые вы можете использовать, что простые потоки Java просто не имеют таких операций при отмене очистки. Вам не нужно делать какой-либо пользовательский интерфейс в фоновом режиме. Вы могли бы просто выполнить одно, написав одно как анонимный класс следующим образом:

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

Он выполнит все, что вы положили в doInBackground в фоновом потоке с заданными параметрами. Аналогично, вы можете просто использовать Void и выполнить без параметров.

Единственное преимущество, которое я мог бы придумать для создания потока таким образом, было бы помочь в дальнейшем обслуживании. Может быть случай, когда вы хотите изменить некоторые вещи, которые должны быть в потоке пользовательского интерфейса, и в этом случае вы переопределите другие методы. В других случаях вы просто не выполняете действие достаточно, чтобы оправдать выписывание другого класса, поэтому просто создавайте его на лету и делайте с ним.

EDIT:

Чтобы ответить на # 3: они фактически одинаковы. Объект Void - это объект Java, как и все остальное. Вы не используете Void, поэтому то, что вы используете в нем, не имеет значения. Это просто контракт AsyncTask требует трех типов типов, которые должны быть переданы, и по умолчанию они Object, который является базовым классом всего.

Ответ 2

(я не могу использовать какой-либо пользовательский интерфейс в этом классе)

Затем просто используйте обычный класс Thread вместо использования класса AsyncTask, который предназначен для работы с изменениями пользовательского интерфейса во время жизни потока:

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

Thread t = new Thread(r);
t.start();

Ответ 3

Это правильное использование AsyncTask?

Вы не сказали, в чем ваша цель. Но AsyncTask обычно используется для длительных задач и обновления интерфейса во время работы, чтобы уведомить о некоторых изменениях в ходе некоторой продолжительной работы. Это также очень эффективный, безопасный для текста инструмент и более сложный, чем Handler, например.

В чем разница между расширением AsyncTask и AsyncTask

AsyncTask является универсальным типом, и вы должны использовать с ними дженерики, код более быстрый, более безопасный тип.

Я не могу использовать любой пользовательский интерфейс

Таким образом, вы скорее можете использовать интерфейс Handler или classic Runnable, и вы можете работать только с рабочими потоками в основном.


Примечание.. В общем случае использование типов generics делает код более быстрым, большинство типов безопасным. Кроме того, следующее преимущество - проверка сильного типа при компиляции исходного кода, ограничения явных преобразований и т.д.