2012-06-25 4 views
37

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

  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;  
    } 
} 

Благодаря

+0

«В чем разница между расширением AsyncTask и AsyncTask» <- Это утверждение не может быть менее ясным, не могли бы вы быть более конкретными? – Devunwired

+2

Извините, видимо, <> не отображается. Я редактировал вопрос. – Rami

ответ

48

Класс 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, который является базовым классом всего.

+0

И как долго новый объект объекта AsyncTask, когда сборщик мусора может его собрать? – mes

+0

@mes AsyncTask будет работать до тех пор, пока doInBackground работает. Как только doInBackground заканчивается и вызывается onCancel или onPostExecute, тогда объект подлежит сбору мусора. Когда сборщик мусора фактически удаляет объект из памяти, это зависит от JVM. – DeeV

16

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

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

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

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

Это правильно. AsyncTask - это всего лишь обернутый поток, который упрощает программирование фоновых задач, взаимодействующих с пользовательским интерфейсом. Если OP не имеет дело с пользовательским интерфейсом, тогда имеет смысл просто напрямую обращаться к потокам. –

+1

@Atlos попытаются прочитать что-то об общих типах ... – Sajmon

+1

Да, дженерики хороши, но AsyncTask не то, что Рами нуждается в том, что было опубликовано. Если нужны дженерики, то может быть реализовано что-то вроде http://stackoverflow.com/questions/1659986/java-parameterized-runnable или может использоваться AsyncTask. –

3

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

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

В чем разница между простирающимся AsyncTask и AsyncTask

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

У меня нет никакой пользы в выполнении какого-либо UI

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


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

+3

Фактически согласно документации AsyncTask следует использовать для более коротких задач. Просмотрите раздел «Обзор класса» по адресу http://developer.android.com/reference/android/os/AsyncTask.html – Mafro34

Смежные вопросы