如何在无限循环中不断更新活动中的 TextView?

Posted

技术标签:

【中文标题】如何在无限循环中不断更新活动中的 TextView?【英文标题】:How to update a TextView in an activity constantly in an infinite loop? 【发布时间】:2012-12-27 00:54:33 【问题描述】:

我有一个带有 TextView 的活动,我想不断更新文本..

在 Java 中,我可以创建一个无限的 while 循环,并在每次迭代时设置文本。

但是当我尝试在 android 中执行此操作时,它会显示黑屏,甚至不加载活动。

我将无限放在onCreate 方法中,也许这就是它崩溃的原因..但如果是,我应该把它放在哪里?

【问题讨论】:

你不应该有一个无限循环,至少不是在主线程上。它的目的是什么? :-) 好吧,我想要一些东西无限更新(或至少不断更新) 类似:***.com/questions/11295152/… || ***.com/questions/1099640/main-loop-in-android ***.com/questions/8123231/… || ***.com/questions/5464990/… 【参考方案1】:

使用Handler 和一个单独的线程/runnable 来不断更新 TextView 而不是 While 循环:

Handler handler=new Handler();
handler.post(new Runnable() 
    @Override
    public void run() 
        // upadte textView here
        handler.postDelayed(this,500); // set time here to refresh textView
    
);

【讨论】:

如果您打算将处理程序作为该闭包的一部分引用,您需要将它作为 final 。【参考方案2】:

最小的工作示例

基于https://***.com/a/14295193/895245:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class Main extends Activity 
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        final int i = 0;
        final TextView textView = new TextView(this);
        textView.setText(String.format("%d", i));
        setContentView(textView);
        final Handler handler = new Handler();
        class MyRunnable implements Runnable 
            private Handler handler;
            private int i;
            private TextView textView;
            public MyRunnable(Handler handler, int i, TextView textView) 
                this.handler = handler;
                this.i = i;
                this.textView = textView;
            
            @Override
            public void run() 
                this.handler.postDelayed(this, 500);
                this.i++;
                this.textView.setText(String.format("%d", i));
            
        
        handler.post(new MyRunnable(handler, i, textView));
    

您只需将其复制粘贴到android create project [...] 生成的主要活动中,您就会在您的应用上看到一个计数器。

在 Android 22 上测试。

【讨论】:

以上是关于如何在无限循环中不断更新活动中的 TextView?的主要内容,如果未能解决你的问题,请参考以下文章

如何打破 C 中的无限 for(;;) 循环?

如何避免 Swing 中的无限更新循环?

Gtkmm:如何从另一个线程更新 UI?连续不断

重新创建活动时如何从 AsyncTask 更新 TextView

js for循环不断循环无限[关闭]

如何可视化vue无限更新循环的无限循环