Какова цель метода GET в AsyncTask, блокирует ли он поток? - PullRequest
0 голосов
/ 25 апреля 2019

Опытный программист здесь, но новичок в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...