如何频繁更新ui元素(文本视图)

时间:2017-03-08 21:30:36

标签: android

在尝试创建应用时,我发现如果我尝试运行类似的功能:

    int i = 1;
    String s = "";

    while(true)
    {
text.setText(sint.valueOf(i)
i=i+1;
    }

其中text是文本视图 并且该功能由一个按钮调用On Click Listener,该应用程序卡在屏幕上增加文本视图的值

有没有办法让这项工作没有设置延迟或延迟最小

如果是这样的id就像一个例子

2 个答案:

答案 0 :(得分:1)

在Activity(或Fragment,或其他)中声明int变量,然后在每次单击时增加该值并将其设置为TextView。你正在做什么不起作用,因为你的while循环是无限的,它在UI线程上运行,因此它阻止了UI,TextView永远不会有机会更新。

public class MainActivity extends AppCompatActivity {

    private int counter;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
        textView.setText(String.valueOf(counter));
        textView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                textView.setText(String.valueOf(++counter));
            }
        });
    }
}

修改

我不确定我是否理解你在这里想要实现的目标,但试试这个。这个想法是,你有一个线程,增加计数器FAST,然后你有一个更新TextView的动画,它将尝试以60fps这样做,所以它会跳过很多数字。您无法快速更新计数器,同时在每次增量时更新TextView。这看起来对我来说完全是胡说八道,但看到快速增长的数字很有趣:)

public class MainActivity extends AppCompatActivity {

    private int counter;
    private TextView textView;
    boolean running;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.text_view);
        textView.setText(String.valueOf(counter));

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Animation animation = new Animation(){
                    @Override
                    protected void applyTransformation(float interpolatedTime, Transformation t) {
                        textView.setText(String.valueOf(counter));
                    }
                };
                animation.setRepeatCount(Animation.INFINITE);
                textView.startAnimation(animation);         
                new Thread(){
                    @Override
                    public void run() {
                        running = true;
                        while(running)
                            counter++;
                    }
                }.start();
            }
        });
    }

    @Override
    protected void onStop() {
        super.onStop();
        running = false;
    }
}

答案 1 :(得分:0)

你可以做这样的方法

private void updateTxt(String newText) {
    txt.setText(newText);
}

并在需要更新TextView

时调用此方法