常见问题解答和 AsyncTask 用法的一般说明
=> 我应该在哪里进行网络操作?我应该在哪里返回我的获取值?
一般来说,您应该在单独的线程中执行网络操作 -> doInBackground(); 因为您不希望您的 UI 在网络操作需要时间时冻结。因此,您应该连接到您的服务或 .php 脚本或从doInBackground()
方法内部获取数据的任何位置。然后,您还可以在那里解析数据并doInBackground()
通过指定返回类型来从方法中返回解析后的数据doInBackground()
,更多关于那里的内容。然后,该onPostExecute()
方法将接收您返回的值doInBackground()
并使用 UI 表示它们。
=> AsyncTask< String, Integer, Long> ==> 这是怎么工作的?
一般来说,这个AsyncTask
类看起来是这样的,它只不过是一个具有 3 种不同泛型类型的泛型类:
AsyncTask<Params, Progress, Result>
您可以指定参数的AsyncTask
类型、进度指示器的类型和结果的类型(doInBackGround() 的返回类型)。
这是一个AsyncTask
看起来像这样的示例:
AsyncTask<String, Integer, Long>
我们有 String 类型的参数,Integer 类型的 Progress 和 Long 类型的 Result(返回类型doInBackground()
)。您可以使用任何类型的参数、进度和结果。
private class DownloadFilesTask extends AsyncTask<String, Integer, Long> {
// these Strings / or String are / is the parameters of the task, that can be handed over via the excecute(params) method of AsyncTask
protected Long doInBackground(String... params) {
String param1 = params[0];
String param2 = params[1];
// and so on...
// do something with the parameters...
// be careful, this can easily result in a ArrayIndexOutOfBounds exception
// if you try to access more parameters than you handed over
long someLong;
int someInt;
// do something here with params
// the params could for example contain an url and you could download stuff using this url here
// the Integer variable is used for progress
publishProgress(someInt);
// once the data is downloaded (for example JSON data)
// parse the data and return it to the onPostExecute() method
// in this example the return data is simply a long value
// this could also be a list of your custom-objects, ...
return someLong;
}
// this is called whenever you call puhlishProgress(Integer), for example when updating a progressbar when downloading stuff
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
// the onPostexecute method receives the return type of doInBackGround()
protected void onPostExecute(Long result) {
// do something with the result, for example display the received Data in a ListView
// in this case, "result" would contain the "someLong" variable returned by doInBackground();
}
}
=> 如何使用 AsyncTask?我怎样才能“调用”它?我怎样才能“执行”它?
在这种情况下,AsyncTask 将一个字符串或字符串数组作为参数,一旦调用 AsyncTask,它将如下所示:(指定的参数用于 AsyncTask 的 execute(param) 方法)。
new DownloadFilesTask().execute("Somestring"); // some String as param
请注意,此调用没有返回值,您应该使用的唯一返回值是从返回的值doInBackground()
。使用 onPostExecute() 方法确实使用了返回值。
还要小心这行代码:(这个执行实际上会有一个返回值)
long myLong = new DownloadFilesTask().execute("somestring").get();
.get() 调用会在 AsyncTask 执行时导致 UI 线程被阻塞(因此如果操作花费的时间超过几毫秒,则 UI 会冻结),因为执行不会在单独的线程中进行。如果您删除对 .get() 的调用,它将异步执行。
=> 这个符号“执行(字符串...参数)”是什么意思?
这是一个带有所谓“ varargs ”(可变参数)参数的方法。为了简单起见,我只想说这意味着您可以通过此参数传递给方法的实际值的数量没有指定,并且您传递给方法的任何数量的值都将被视为内部的数组方法。因此,此调用可能如下所示:
execute("param1");
但它也可能看起来像这样:
execute("param1", "param2");
甚至更多参数。假设我们还在讲AsyncTask
,在方法中可以这样访问参数doInBackground(String... params)
:
protected Long doInBackground(String... params) {
String str1 = params[0];
String str2 = params[1]; // be careful here, you can easily get an ArrayOutOfBoundsException
// do other stuff
}
您可以在此处阅读有关 AsyncTask 的更多信息:http: //developer.android.com/reference/android/os/AsyncTask.html
另请查看此 AsyncTask 示例:https ://stackoverflow.com/a/9671602/1590502