Я бы лучше изолировал бизнес-логику от AsyncTask, чем изолировал AsyncTask от Activity.
В общем, AsyncTask имеет очень специфический дизайн и вариант использования в жизненном цикле приложения Android, то есть выполнить некоторое трудоемкое задание в фоновом потоке, после чего обновить представление Activity в потоке пользовательского интерфейса. Вот почему всегда рекомендуется использовать его как внутренний класс Activity.
Более функциональный ОО-дизайн IMO изолирует и централизует вашу бизнес-логику в POJO (для повторного использования). Для тестируемости вы можете сделать что-то вроде этого:
1. Определить интерфейс IBusinessDAO
2. Определить, что RealBusinessDAO реализует IBusinessDAO
3. Определить, MockBusinessDAO реализует IBusinessDAO
4. Позвоните IBusinessDAO.foo (); внутри AsyncTask.doInBackground ()
Для модульного тестирования вашей бизнес-логики, поскольку это POJO, вы можете использовать только JUnit для написания своего тестового примера. Иногда мы хотим протестировать компонент пользовательского интерфейса, и нам неважно, как реализована основная бизнес-логика, например, моя бизнес-логика подключается к удаленному http-серверу, загружает некоторые данные json, я не хочу делать это каждый раз, когда просто Я хочу протестировать макет пользовательского интерфейса, для этой ситуации я могу легко изменить свою активность, используя MockBusinessDAO (своего рода концепцию DI Spring), например:
public class MyActivity extends Activity {
IBusinessDAO businessDAO;
... ...
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
... ...
protected void doInBackground(Void... params) {
businessDAO.foo();
}
}
... ...
public void onCreate(Bundle savedInstanceState) {
if (runInTest)
businessDAO = new MockBusinessDAO();
else
businessDAO = new RealBusinessDAO();
new myAsyncTask().execute();
}
}
Вот некоторые преимущества:
1. Реализация AsyncTask проста и понятна (несколько строк кода в doInBacnground ())
2. Реализация бизнес-логики является чисто POJO, улучшите возможность повторного использования.
3. Изоляция тестовой бизнес-логики и компонента пользовательского интерфейса, улучшение тестируемости.
Надеюсь, что поможет.