一直都认为子线程不能更新UI,觉得这是Android系统规定的,所以也没想过为什么。直到今天刷题时看到一个言论说在onResume之前子线程是可以更新UI的。经测试,确实如此,并且在onResume时也可以用子线程更新UI,在onPause或点击时都会报错。
public class MainActivity extends AppCompatActivity implements View.OnClickListener,Runnable{
private Button btn;
private TextView tv;
private String tag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)findViewById(R.id.btn_test);
btn.setOnClickListener(this);
tv=(TextView)findViewById(R.id.tv_test);
tag="onCreate时";
new Thread(this).start();
}
@Override
protected void onStart() {
super.onStart();
tag="onStart时";
new Thread(this).start();
}
@Override
protected void onResume() {
super.onResume();
tag="onResume时";
new Thread(this).start();
}
@Override
protected void onPause() {
super.onPause();
tag="onPause时";
new Thread(this).start();
}
@Override
public void onClick(View v) {
new Thread(this).start();
}
@Override
public void run() {
tv.setText(Looper.myLooper()==Looper.getMainLooper()?"主线程":"子线程"+tag+"更新UI成功了");
}
}
网上的结论说是只要子线程有ViewRoot就可以更新UI,暂时没有看懂,Mark一下。
子线程也可以更新UI