【问题标题】:how to change UI element in a new thread task.onDone()?如何在新线程 task.onDone() 中更改 UI 元素?
【发布时间】:2012-12-28 14:58:17
【问题描述】:

我怎样才能做到这一点?

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        FacebookConnectTask task = 
                new FacebookConnectTask("facebookId", "token", "email", facebookGender,0, 0);
        task.setOnPreExecuteListener(this);
        task.setOnDoneListener(this);
        task.execute();
    }
});
t.start();

public void onPreExecute() { 
    progressbar.setVisibility(View.VISIBLE);
}

public void onDone() { 
    progressbar.setVisibility(View.GONE);
}

由于我正在打开一个新线程,我无法更改其中的 UI 元素,所以,我该如何设法对 UI 做一些事情,任务何时开始以及何时完成?

【问题讨论】:

    标签: android multithreading user-interface task


    【解决方案1】:

    您可以在AyncTask 中完成这项工作。 AsyncTask 在另一个线程内执行 doInBackground() 中的所有内容,该线程无权访问您的视图所在的 GUI。

    preExecute()postExecute() 在这个新线程中发生繁重工作之前和之后为您提供对 GUI 的访问,您甚至可以将长操作的结果传递给postExecute(),然后显示任何处理结果。

    更多:http://developer.android.com/reference/android/os/AsyncTask.html

    此处示例:http://www.vogella.com/articles/AndroidPerformance/article.html

    【讨论】:

    • 在我看到你的答案之前,我尝试了 runOnUiThread(new Runnable... 并且它有效。你认为它是一个可扩展的解决方案吗?对我来说它看起来有点 msss...
    • 真的很方便。 AsyncTask 框架处理线程池的管理,并提供了一个简单易懂的界面。 -- UI 活动可以在onPreExecute()onPostExecute()onProgressUpdate() 中进行,并且所有“繁重的工作”都在doInBackground() 中完成,不允许您触摸 UI。为什么不这样做,而不是创建并尝试管理自己的线程
    【解决方案2】:

    在你的活动中

    private Handler myHandler=new Handler();
    

    在你的 on done 回调中的下一个

    public void onDone() { 
    myHandler.post(new Runnable(){
       @Override
       public void run() {
          progressbar.setVisibility(View.GONE)
       }
    })
    }
    

    但正如已经说过的那样。 AsyncTask 更适合它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多