0

我正在做一些修改,因为我是一个菜鸟程序员——目前正在尝试理解 AsyncTask。我有这个例子,说明它是如何用于下载和显示网页内容的,但我正在努力弄清楚哪些位在做什么。不幸的是,我的笔记很垃圾。谁能帮忙解释一下?

4

5 回答 5

1
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);
}
于 2013-08-09T17:44:51.157 回答
0

首先,顺便说一句:几天前我终于“得到”了 AsyncTask,所以我现在也很高兴能帮助其他人得到它。无论如何,我在没有真正理解它是如何工作的情况下浏览了一堆教程(官方文档在这方面没有帮助)。这是最终让它点击的那个:http ://www.brighthub.com/mobile/google-android/articles/82805.aspx

于 2013-08-09T17:57:53.070 回答
0

所以我真的不知道您最不清楚哪些部分,但让我解释一下基础知识:

您在代码中创建了一个私有 Async-Task。此类的方法可以在您的应用程序继续正常运行时在后台运行(否则,它将冻结)。在 doInBackground() 方法中声明的所有内容都在后台执行。

要开始执行,您调用 execute() 方法,这当然在您的私有 Async-Task 之外。在调用 execute() 方法之前,您将实例化 Async-Task。

onPostExecute() 的方法可用于例如处理结果或返回值。当 doInBackground() 完成时调用此方法。

于 2013-08-09T17:46:05.043 回答
0

您不能在 doInBackground 内的视图中触摸,例如 textView.setText(response); 它错了,你需要在onPreExecute和onPostExecute中触摸视图,并且在doInBackground中不要锁定UI线程,此外,onPre和onPost会锁定UI线程。

AsyncTask看这个链接,AsyncTask 的文档。

于 2013-08-09T17:48:07.210 回答
0

当您启动 AsyncTask 时,它会在不同的线程上执行 doInBackground() 方法,这样它就不会锁定您的 UI 或任何其他线程。当 doInBackground() 方法完成时,该方法的返回值被传递给 onPostExecute()。onPostExecute 方法在 UI 线程上执行,因此您应该在此处对视图等进行任何更改。

于 2013-08-09T17:56:30.303 回答