0

我的任务是开发一个发送服务器请求并获取响应的应用程序,然后使用 JSON 解析,将数据内容显示到 ListView 中。

我不了解 AsyncTask 以及如何集成所有类。希望你能包容。问候

4

2 回答 2

2

你该怎么办?

The first, send a request to server

The second, get response

The thirds, Parse data from InputStream which you got from Response

The fourth, show on ListView

哦,完成了。现在,看看第一步。

如何向服务器发送请求?

您可以使用HttpURLConnectionHttpClient

那么,当您向服务器发送请求时会出现什么问题?

我想你知道当你向服务器发送请求时,你会遇到一些问题:网络不好,来自服务器的 InputStream 太大,......

以及如何解决?

使用单一语句,您不能花时间去做。因此,对于需要花费时间完成的任务,您必须在其他线程中处理。这就是我们应该使用 Thread 或 AsyncTask 的原因。

什么是异步任务

您可以通过谷歌搜索阅读更多内容。我只是告诉你:如何使用 AsyncTask 来解决你的规范。

AsyncTask是做什么的?

当您创建AsyncTask的实例时,

它将遵循:

-> 创建 -> PreExecute -> 执行 (DoInBackground) - PostExecute

好的。

现在,我来回答你的问题:

创建一个扩展 AsyncTask 的对象。

public class DownloadFile extends AsyncTask<String, Void, InputStream> {
    @Override
    public void onPreExecute() {
        // You can implement this method if you want to prepare something before start execute (Send request to server)
        // Example, you can show Dialog, or something,...
    }
    @Override
    public InputStream doInBackground(String... strings) {
        // This is the important method in AsyncTask. You have to implements this method.
        // Demo: Using HttpClient 
        InputStream mInputStream = null;
        try {
            String uri = strings[0];
            HttpClient mClient = new DefaultHttpClient();
            HttpGet mGet = new HttpGet(uri);

            HttpResponse mResponse = mClient.execute(mGet);

            // There are 2 methods: getStatusCode & getContent.
            // I dont' remember exactly what are they. You can find in HttpResponse document.
            mInputStream = mReponse.getEntity().getContent();
        } catch (Exception e) {
            Log.e("TAG", "error: " + e.getMessage());
        }

        return mInputStream;
    }

    @Override
    public void onPostExecute(InputStream result) {
        //After doInBackground, this method will be invoked if you implemented.
        // You can do anything with the result which you get from Result.
    }
}

好的。现在我们必须使用这个类

在您的MainActivity或您要调用此类的地方,创建此类的实例

DownloadFile mDownloader = new DownloadFile();
mDownloader.execute("your_url");

使用方法mDownloader.get(); 如果你想得到InputStream 但是你必须被try-catch包围

我知道,如果您想使用 Dialog,您将在 Google 上搜索如何在从服务器下载文件时显示 Dialog。

我建议你应该记住,如果你想更新 UI,你需要 runOnUiThread。因为 AsyncTask 是线程。因此,如果您在另一个不是 MainThread 的线程中,则无法更新 UI。

于 2013-08-16T09:41:39.177 回答
0

异步任务

AsyncTask 允许正确和轻松地使用 UI 线程。当您想在后台执行期待已久的任务时使用它。

它在 UI 线程上发布结果(将结果显示到 UI),而无需操作任何线程或处理程序。这意味着用户不必为线程管理而烦恼,一切都由自己管理。这就是为什么它被称为无痛穿线,见下文。

它也被称为无痛穿线

AsyncTask 操作的结果在 UI 线程上发布。它基本上有 4 种方法可以覆盖:onPreExecute、doInBackground、onProgressUpdate 和 onPostExecute

永远不要指望通过参考简短的笔记成为程序员,深入学习..

这里查看更多详细信息。

于 2013-08-16T09:38:21.210 回答