Android - 在运行任务时更新UI?

时间:2014-08-20 14:16:43

标签: java android multithreading

我以前曾问过,但没有得到任何有用的回复。 我有一个方法。我想通过该方法更新UI。我尝试在UI线程上运行代码,我尝试发布代码(.post [...]),我尝试创建线程但没有任何作用。

以下是我的代码的简化版本:

int x;
for(int i = 0; i < times; i++){
    if((i % 2) == 1){
        x += (x / (x * 0.5));
    } else {
        x += (x / (x * 0.25));
    }
    while((System.currentTimeMillis() - t) < 2000){
        // wait
    }
    runOnUiThread(new Runnable(){
        @Override
        public void run(){
            btn.setText(x.toString());
        }
    }
} // The for loop won't update the UI until the entire method has finished.

就像我说的,创建一个新的线程/在UI线程/发布上运行没有帮助。 如何在方法运行时更新UI?

由于某种原因,UI将等到方法完成。

3 个答案:

答案 0 :(得分:1)

  

由于某种原因,UI将等到方法完成。

您对setText()的调用会安排对屏幕的更新,但在您将主应用程序线程的控制权返回给框架之前,该更新不会发生。只要您占用该线程,屏幕就不会更新。

  

如何在方法运行时更新UI?

如果该方法在主应用程序线程上运行 - 如果上面的代码片段没有崩溃,则必须是这样 - 在运行时无法更新UI。

您可能希望提出一个新的Stack Overflow问题,在那里您可以解释您真正想要做的事情。在original question中,您可以参考动画,但不提供与该动画或runIntensiveMethod()的实施相关的代码。

答案 1 :(得分:0)

可能应该使用AsyncTask

AsyncTask具有onProgressUpdate(Integer ...)方法,您可以通过调用publishProgress()在doInBackground()期间调用每次迭代,例如每次迭代。

android docs

答案 2 :(得分:0)

您可能希望在此处使用AsynkTask。 它可以是这样的。

class MyTask extends AsycnTask<Void,Integer,Void> {
    @Override
    protected Void doInBackground(Void... params) {
        for(int i = 0; i < times; i++){
            if((i % 2) == 1){
                x += (x / (x * 0.5));
            } else {
            x += (x / (x * 0.25));
            }
            publishProgress(x);
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        btn.setText(String.valueOf(progress[0]));
    }
}

然后在Activity new MyTask().execute()中。有关AsyncTask here

的更多信息

但是这个方法真的会导致你的UI线程冻结吗?如果你在活动中调用它,它是否只是更新值?