Android:为什么我可以在背景线程中更新TextView?

时间:2019-06-12 00:30:48

标签: android multithreading textview

Android指定无法从后台线程更新UI,但是如果我运行下一个代码,则可以毫无问题地运行。为什么我可以在后台线程中更新TextView?该代码每秒钟更新一次名为Contador的textView中的值(计数器)。

public class MainActivity extends AppCompatActivity {

private TextView contador;
private int contadorTiempo=0;
private Button btnCnt10S;
private TextView cont10s;
private Button btnStart;
private Button btnStop;
private int cuenta=0;

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

    btnCnt10S = findViewById(R.id.idContBtn);
    contador = findViewById(R.id.contador);
    cont10s = findViewById(R.id.idCont10);
    btnStart = findViewById(R.id.idStartBtn);
    btnStop = findViewById(R.id.idStopBtn);


    btnCnt10S.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

    btnStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           new Thread(new miRunable()).start(); 
        }
    });

    btnStop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            contador.setText("0");
        }
    });
}


class miRunable implements Runnable{

    @Override
    public void run(){
        for(;;) {
            contadorTiempo++;
            contador.setText(Integer.valueOf(contadorTiempo).toString());

            try {
                Thread.sleep(1000);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

}

1 个答案:

答案 0 :(得分:1)

TLDR不要这样做,这是一个错误的做法,或者根本不是一个错误的代码。

您可以(幸运的话)在后台线程中更新视图。没有什么可以监视它的,这就是为什么您无法使用它。但是不能保证它每次都会工作。

如果android试图从主线程更新视图,您最终将陷入竞争状态。