1

我有几个方法的主要活动。

  • GetTopics:调用 REST API 并返回 JSON 结果
  • BindTopics:在屏幕上显示来自 GetTopics 的结果

还有一些其他具有类似功能的,但我确信我可以将解决方案适用于所有方法。

问题:在单独的线程中运行这些的正确方法是什么?他们应该在同一个线程中吗?GetTopics 完成后我应该调用 BindTopics 吗?

无论哪种方式,UI 不是在异步线程完成之前构建的吗?如果是这样,我如何更新 UI?

任何帮助表示赞赏。

4

4 回答 4

3

你所有问题的答案是AsyncTask

于 2012-04-24T14:23:12.813 回答
1

我会在带有 AsyncTask 的进度对话框中加载它。您需要声明处理程序以更新 UI 线程中的控件。

例子:

private Handler     handler         = new Handler();


final ProgressDialog pd = new ProgressDialog(this);
pd.setTitle("Getting topics..");
pd.setMessage("Please while topics are retrieved");
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setIndeterminate(true);

new AsyncTask<Void, Void, Void>() {

    @Override
    protected Void doInBackground(Void... params) {

        GetTopics();

        return null;
    }

    @Override
    protected void onPreExecute() {

        pd.show();
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Void result) {

        BindTopics();

        pd.dismiss();

        handler.post(new Runnable() {

            public void run() {
                // update UI
                // remove loading view
                // load details of topics
            }
        });
        super.onPostExecute(result);
    }

}.execute();
于 2012-04-24T14:36:28.947 回答
1

您想创建您的 UI(带有某种加载屏幕),然后启动 AsyncTask 以下载数据并显示它。

这里有一篇关于 AsyncTasks 的基本博客文章:http ://android-developers.blogspot.co.uk/2009/05/painless-threading.html

在 AsyncTasks doInBackground 方法中,您将调用 GetTopics。然后在 onPostExecute 方法中调用 BindTopics 并显示数据。在 onPostExecute 方法中,您可以在尝试显示数据之前检查数据是否正确下载。

于 2012-04-24T14:25:11.690 回答
0

对我来说,线程的主要用途是当我的应用程序必须从 ftp 服务器下载大量数据时。但是在下载时我希望用户仍然可以使用我的应用程序。如果我在主线程中编写了下载代码,用户将无法使用该应用程序并且所有按钮都将不起作用。线程的主要思想是为每个线程划分CPU使用时间。

如果您希望同时执行一项以上的任务,则必须使用线程。

于 2012-04-24T14:50:24.840 回答