Android中线程的正确用法是什么?

时间:2012-04-24 14:19:00

标签: android multithreading progressdialog

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

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

还有一些其他功能相似,但我确信我可以在所有方法中使用这些解决方案。

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

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

感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

您的所有问题的答案都是AsyncTask

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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();

答案 3 :(得分:0)

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

如果您希望同时执行多个任务,则必须使用“线程”。