首页 > 解决方案 > AsyncTask 中的 GET 方法的目的是什么,它会阻塞线程吗?

问题描述

这里有经验丰富的程序员,但对 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

标签: androidandroid-asynctask

解决方案


推荐阅读