我正在做一些修改,因为我是一个菜鸟程序员——目前正在尝试理解 AsyncTask。我有这个例子,说明它是如何用于下载和显示网页内容的,但我正在努力弄清楚哪些位在做什么。不幸的是,我的笔记很垃圾。谁能帮忙解释一下?
5 回答
private class DownloadWebpageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(
new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
} catch (Exception e) {
e.printStackTrace();
}
}
// since this is the background thread, we need to return the string reponse so that onPostExecute can update the textview.
return response
}
@Override
protected void onPostExecute(String result) {
// only onPostExecute,onProgressUpdate(Progress...), and onPreExecute can touch modify UI items since this is the UI thread.
textView.setText(result);
}
首先,顺便说一句:几天前我终于“得到”了 AsyncTask,所以我现在也很高兴能帮助其他人得到它。无论如何,我在没有真正理解它是如何工作的情况下浏览了一堆教程(官方文档在这方面没有帮助)。这是最终让它点击的那个:http ://www.brighthub.com/mobile/google-android/articles/82805.aspx
所以我真的不知道您最不清楚哪些部分,但让我解释一下基础知识:
您在代码中创建了一个私有 Async-Task。此类的方法可以在您的应用程序继续正常运行时在后台运行(否则,它将冻结)。在 doInBackground() 方法中声明的所有内容都在后台执行。
要开始执行,您调用 execute() 方法,这当然在您的私有 Async-Task 之外。在调用 execute() 方法之前,您将实例化 Async-Task。
onPostExecute() 的方法可用于例如处理结果或返回值。当 doInBackground() 完成时调用此方法。
您不能在 doInBackground 内的视图中触摸,例如 textView.setText(response); 它错了,你需要在onPreExecute和onPostExecute中触摸视图,并且在doInBackground中不要锁定UI线程,此外,onPre和onPost会锁定UI线程。
AsyncTask看这个链接,AsyncTask 的文档。
当您启动 AsyncTask 时,它会在不同的线程上执行 doInBackground() 方法,这样它就不会锁定您的 UI 或任何其他线程。当 doInBackground() 方法完成时,该方法的返回值被传递给 onPostExecute()。onPostExecute 方法在 UI 线程上执行,因此您应该在此处对视图等进行任何更改。