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();
}
}
}
}
}
答案 0 :(得分:1)
TLDR不要这样做,这是一个错误的做法,或者根本不是一个错误的代码。
您可以(幸运的话)在后台线程中更新视图。没有什么可以监视它的,这就是为什么您无法使用它。但是不能保证它每次都会工作。
如果android试图从主线程更新视图,您最终将陷入竞争状态。