Я пытаюсь реорганизовать одно из моих действий. У меня очень большой частный класс AsyncTask, который я хочу добавить в отдельный класс. Сам AsyncTask также должен обновить интерфейс после завершения, поэтому я должен предоставить контекст приложения для этого класса.
Теперь какой из этих двух способов лучше подходит: просто создайте класс как задачу?
public class MyCustomTask extends AsyncTask
Использовать с:
new MyCustomTask().execute();
Или создать Actitvity, который сам запускает задачу, и называть это Actitivy по намерению?
public class MyCustomActivity extends Activity {
onCreate() {
new MyCustomTask().execute();
}
private class MyCustomTask extends AsyncTask<..>();
}
Использовать с:
Intent intent = new Intent(this, MyCustomActivity.class);
Если у вас есть раздельная AsyncTask и нужно выполнять манипуляции с пользовательским интерфейсом в postExecute, есть 3 способа ее выполнения:
переопределите его в своей деятельности. В подклассе добавляется только код манипулирования пользовательским интерфейсом.
создать интерфейс и использовать его в качестве слушателя. см. здесь
передайте свою активность в качестве параметра для AsyncTask. см. здесь
Для 2 и 3 вы хотите проверить, активна ли активность в postExecute().
Вот как я делаю ASyncTask в своих действиях:
public class MyClass extends Activity {
@Override
public void onClick(View v) {
MyNewThread thread = new MyNewThread();
thread.execute();
}
private class MyNewThread extends ASyncTask<Void, Void, Void> {
//Code goes here
}
}
Очень псевдокод, но вы получаете идею, это всего лишь внутренний частный класс для этой деятельности. Теперь, если этот точный поток - это то, что вы будете запускать в нескольких действиях, то это может стоить сделать его собственным классом. Но если вы просто делаете это здесь, эта реализация в порядке. В любом случае, не делайте его активным, его просто обычный класс, который расширяет ASyncTask.
Просто оставайтесь прежними, если AsyncTask
взаимодействует с Activity, иначе создайте отдельный. Преимущество использования AsyncTask
как внутреннего класса заключается в том, что этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.
Нет причин создавать отдельную Activity
исключительно для запуска AsyncTask
. Просто создайте его как отдельный класс и при необходимости перейдите в Context
. Просто убедитесь, что вы не пропустите его.