Опытный программист здесь, но новичок в Android / Java. Я изучал AsyncTask и думаю, что понимаю большинство функций, но у меня есть вопрос об использовании метода GET.
Кажется, что он блокирует поток во время ожидания результата. Разве это не сводит на нет весь смысл использования AsyncTask? Я подозреваю, что у этого должна быть цель, которую я не понимаю.
Ни одна из прочитанных книг или других ресурсов не дает примеров того, как / когда / если их использовать. Я понимаю, что могу использовать onPostExecute, чтобы вернуть набор результатов, и, скорее всего, я выберу маршрут, но мне интересно, каков вариант использования get ()?
Спасибо за любое просвещение.
public void button1Clicked(View v){
AsyncTask<Void, Void, String> MyTask = new MyTask();
log("Test 1. About to execute");
try {
MyTask.execute(); // This version returns immediately
} catch(Exception e){
e.printStackTrace();
}
log("Test 1. Back from execute");
}
public void button2Clicked(View v){
AsyncTask<Void, Void, String> MyTask = new MyTask();
log("Test 2. About to execute");
try {
String result = MyTask.execute().get(); // This version waits here, blocking the UI
log("Result=" + result);
} catch(Exception e){
e.printStackTrace();
}
log("Test 2. Back from execute");
}
class MyTask extends AsyncTask<Void, Void, String> {
@Override protected String doInBackground(Void... params){
log("doInBackground started");
try { // Sample long running task here
for(int i=0; i< 3; i++){
log("Tick: " +i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
log("doInBackground completed");
return "done";
}
}
public void log(String message){
Log.i("DEB:" +Thread.currentThread().getName(), message);
}
--- Журнал при нажатии кнопки 1 ---
DEB:main: Test 1. About to execute
DEB:main: Test 1. Back from execute
DEB:AsyncTask #1: doInBackground started
DEB:AsyncTask #1: Tick: 0
DEB:AsyncTask #1: Tick: 1
DEB:AsyncTask #1: Tick: 2
DEB:AsyncTask #1: doInBackground completed
--- Журнал при нажатии кнопки 2 ---
DEB:main: Test 2. About to execute
DEB:AsyncTask #2: doInBackground started
DEB:AsyncTask #2: Tick: 0
DEB:AsyncTask #2: Tick: 1
DEB:AsyncTask #2: Tick: 2
DEB:AsyncTask #2: doInBackground completed
DEB:main: Result=done
DEB:main: Test 2. Back from execute