Вы обертывание AsyncTask
внутри другого класса POJO; делать это не повредит, но приносит небольшую пользу.
Учтите, что когда задача будет завершена, вы захотите получить уведомление об обратном вызове. Ваш MainClass
получит обратный вызов в processDone()
, но что-то нужно будет слушать MainClass
, чтобы получить это уведомление.
Вот образец, который я всегда использую с моим AsyncTask
подклассов:
public class GetDataRemoteTask extends AsyncTask<String, Void, Data> {
private static final String TAG = "GetDataRemoteTask ";
private WeakReference<GetDataResultListener> mListenerRef;
private Exception mExc;
@Override
protected Data doInBackground(String... params) {
Data result = null;
try {
result = mService.getData(params[0], params[1], params[2]);
} catch (Exception e) {
Log.e(TAG, "Error occurred getting data", e);
mExc = e;
}
return result;
}
@Override
protected void onPostExecute(Data result) {
if (mListenerRef != null) {
GetDataResultListener listener = mListenerRef.get();
if (listener != null) {
if (mExc == null) {
listener.dataReceived(result);
} else {
listener.dataException(mExc);
}
}
}
}
public void setGetDataResultListener(GetDataResultListener listener) {
if (listener == null) {
this.mListenerRef = null;
} else {
this.mListenerRef = new WeakReference<GetDataResultListener >(listener);
}
}
public static interface GetDataResultListener {
public void dataReceived(Data data);
public void dataException(Exception exc);
}
}
Итак, чтобы начать, здесь у меня есть интерфейс, как вы делаете, для подключения к AsyncTask
.Но я не завершу свой AsyncTask
реализацией, я ожидаю, что у меня будет Activity
или Fragment
, которые будут реализовывать этот интерфейс. (Вот почему я использую WeakReference
, если заканчивается Activity
, мой AsyncTask
не будет удерживаться на Activity
. Но это также означает, что я не могу использовать прослушиватель анонимного класса, если только клиент не держит ссылку для него.)
Мой клиент код будет выглядеть следующим образом:
GetDataRemoteTask task = new GetDataRemoteTask();
task.setListener(this);
task.execute(param1, param2, param3);
у меня также есть способ узнать, есть ли исключение, которое произошло в фоновом режиме. Любые фоновые исключения всегда должны сообщаться клиенту, который может решить, как лучше всего справиться с этим исключением - например, открыть диалог для пользователя, чтобы они знали, что запрос не выполнен.
Я считаю, что большой недостаток AsyncTask
заключается в том, что он не имеет больше структуры вокруг обработки исключений, которые встречаются в фоновом потоке.
В моей задаче содержится ссылка на исключение, но я также использовал Pair<Data, Exception>
как параметр типа для результата возврата, поэтому мне не требуется свойство исключения.
Использование этого шаблона помогло мне избежать некоторых типичных проблем, возникающих при кодировании подклассов AsyncTask
.
Но я мог бы просто сделать его многоразовым, разделив класс асинтезы и использовать его в других классах. Тогда я должен был бы иметь интерфейс правильно? –