关于AsyncTask的常见问题和使用方法的概述
=> 我应该在哪里进行网络操作?我应该在哪里返回已获取的值?
通常情况下,你应该在一个独立线程 -> doInBackground();中执行网络操作,因为当网络操作耗时时,你不希望UI被冻结。所以你应该在doInBackground()
方法中连接到你的服务或.php脚本或者从任何地方获取数据。然后你也可以在这里解析数据并通过指定doInBackground()
方法的返回类型来返回解析后的数据,更多详情请看下文。onPostExecute()
方法将会接收到doInBackground()
方法返回的值,并使用UI来展示它们。
=> AsyncTask< String, Integer, Long> ==> 它是如何工作的?
一般来说,AsyncTask
类看起来像这样,它只是一个具有3个不同泛型类型的通用类:
AsyncTask<Params, Progress, Result>
您可以指定AsyncTask
所需的参数类型、进度指示器类型以及结果(doInBackGround()方法的返回类型)的类型。
以下是AsyncTask
的一个示例:
AsyncTask<String, Integer, Long>
我们为参数使用了字符串类型(String),进度使用整型(Integer),以及结果(return type of doInBackground()
)使用长整型(Long)。 你可以使用任何你想要的类型来代替Params、Progress和Result。
private class DownloadFilesTask extends AsyncTask<String, Integer, Long> {
protected Long doInBackground(String... params) {
String param1 = params[0];
String param2 = params[1];
long someLong;
int someInt;
publishProgress(someInt);
return someLong;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
}
}
如何使用AsyncTask?我该如何“调用”它?如何“执行”它?
在这种情况下,AsyncTask将以字符串或字符串数组的形式作为参数(一旦调用AsyncTask,指定的参数将在execute(param)方法中使用)。
new DownloadFilesTask().execute("Somestring"); // some String as param
请注意,此调用没有返回值,你应该使用从doInBackground()
返回的唯一返回值。 使用onPostExecute()方法来利用返回的值。
还要小心这行代码:(此执行将实际返回一个值)
long myLong = new DownloadFilesTask().execute("somestring").get();
.get()调用会导致UI线程被阻塞(如果操作时间超过几毫秒,则UI将冻结),因为执行没有发生在单独的线程中。如果您删除对.get()的调用,它将以异步方式执行。
=> 这个符号 "execute(String... params)" 是什么意思?
这是一个具有所谓"可变参数"(variable arguments)参数的方法。简单来说,这意味着通过这个参数可以传递给方法的实际值的数量未指定,并且您传递给该方法的任何数量的值都将在方法内部被视为一个数组。因此,这个调用可能看起来像这样:
execute("param1");
但它也可能看起来像这样:
execute("param1", "param2");
或者甚至更多的参数。假设我们还在讨论AsyncTask
,这些参数可以在doInBackground(String... params)
方法中通过以下方式访问:
或甚至有更多的参数。如果我们仍然在谈论AsyncTask
,则可以在doInBackground(String... params)
方法中以此方式访问这些参数:
protected Long doInBackground(String... params) {
String str1 = params[0];
String str2 = params[1];
}
你可以在这里阅读有关AsyncTask的更多信息:http://developer.android.com/reference/android/os/AsyncTask.html
同时,也可以查看这个AsyncTask示例:https://dev59.com/0Gkw5IYBdhLWcg3wwNN5#9671602