Это было задано в одном из интервью с Android. Меня спросили, можно ли запустить другую задачу async (пусть это будет Task2) из doInBackground() метода async-задачи 1 (пусть это будет Task1). Я прошел через документы, которые говорят следующее:
Экземпляр задачи должен быть создан в потоке пользовательского интерфейса.
execute (Params...) должен быть вызван в потоке пользовательского интерфейса.
В соответствии с этими утверждениями, я думаю, что не должно быть возможности запустить задачу из фонового метода другой задачи. Кроме того, в async-задаче есть методы пользовательского интерфейса (которые нельзя использовать в фоновом потоке), что усилило мои аргументы, и я ответил, что это невозможно.
При проверке простого демонстрационного приложения я увидел, что это действительно возможно. Некоторые демо-коды:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
init();
Log.v ("gaurav", "Thread is : " + Thread.currentThread().getName());
Task1 task = new Task1();
task.execute();
}
class Task1 extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
Log.v ("gaurav", "Thread task 1 is : " + Thread.currentThread().getName());
Task2 task = new Task2();
task.execute();
return null;
}
}
class Task2 extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
Log.v ("gaurav", "Thread task 2 is : " + Thread.currentThread().getName());
Log.v ("gaurav", "Task 2 started");
return null;
}
}
Я получаю следующие журналы, указывающие на успешное выполнение:
> 08-07 09:46:25.564: V/gaurav(2100): Thread is : main 08-07
> 09:46:25.564: V/gaurav(2100): Thread task 1 is : AsyncTask #3 08-07
> 09:46:25.564: V/gaurav(2100): Thread task 2 is : AsyncTask #4 08-07
> 09:46:25.564: V/gaurav(2100): Task 2 started
Я проверил это на устройстве ICS, KK и L, и он отлично работает для всех.
Одна из причин, по которой я мог подумать, заключается в том, что я не переопределяю какие-либо методы пользовательского интерфейса и не делаю никаких изменений в пользовательском интерфейсе в своей второй задаче, поэтому это не вызывает никаких проблем, но я не уверен. Даже в этом случае он нарушает правила потоков, упомянутые в руководстве разработчика.
В качестве ссылки я также проверил эту ссылку: Запустите AsyncTask из другого AsyncTask doInBackground(), но в ответе говорится, что для запуска второй задачи используется метод runOnUiThread() внутри doInBackground(). Мне нужна помощь в том, что происходит здесь. Спасибо.