android - 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
解决方案
推荐阅读
- python - 如何将多个矩阵组合成一个矩阵?
- python - numpy 矩阵列表分配没有参考
- rest - MS Graph API 中更新组操作的 API 速率限制是多少?
- ajax - 如何使用 AJAX 将数据从控制器传递到视图
- apache-spark - 如何使用 Airflow 重新启动失败的结构化流式 Spark 作业?
- java - 基于数据类型的泛型类术语问题
- javascript - Uncaught SyntaxError: Unexpected token '&' (动态导入)
- javascript - Javascript - 在外部点击时关闭模式的问题
- abap - 修改一个db的db_table类型表
- java - 如何在 Maven 项目中使用 Junit5 为执行结果创建 xml?