【问题标题】:What is the proper use of threads in Android?Android中线程的正确使用是什么?
【发布时间】:2012-04-24 14:18:59
【问题描述】:

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

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

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

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

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

感谢任何帮助。

【问题讨论】:

    标签: android multithreading progressdialog


    【解决方案1】:

    您所有问题的答案是AsyncTask

    【讨论】:

      【解决方案2】:

      我会在带有 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】:

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

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

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

        【讨论】:

        • 这正是我所需要的!非常感谢。
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-01
          • 2021-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多