Android UI更新的几种方法总结
AndroidUI更新
做过Android开发的人都遇到过这样的问题:随着需求的变化,某些入口界面会出现UI的增减、内容变化和跳转界面变化等问题,这里就说明几种方法来实现 UI的更新。
1、Activity的runOnUiThread
textView=(TextView)findViewById(R.id.tv);
newThread(newRunnable(){
@Override
publicvoidrun(){
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
textView.setText("更新UI了");
}
});
}
}).start();
androidActivityrunOnUiThread()方法使用
2、HandlersendEmptyMessage()
packagelib.com.myapplication;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.widget.TextView;
publicclassMainActivityextendsAppCompatActivity{
privateTextViewtextView;
Handlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
textView.setText("Ui更新了");
}
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.tv);
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
handler.sendEmptyMessage(2);
}
}).start();
}
}
3、Handler post()
packagelib.com.myapplication;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.support.v7.app.AppCompatActivity;
importandroid.widget.TextView;
publicclassMainActivityextendsAppCompatActivity{
privateTextViewtextView;
Handlerhandler=newHandler();
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.tv);
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
handler.post(newRunnable(){
@Override
publicvoidrun(){
textView.setText("Ui更新了");
}
});
}
}).start();
}
}
在子线程中切换到主线程
newThread(newRunnable(){
@Override
publicvoidrun(){
LogUtil.d("ttt11111111111"+Thread.currentThread().getName());
newHandler(Looper.getMainLooper()).post(newRunnable(){
@Override
publicvoidrun(){
LogUtil.d("ttt55555555"+Thread.currentThread().getName());
}
});
LogUtil.d("ttt22222222222"+Thread.currentThread().getName());
LogUtil.d("ttt33333333333"+Thread.currentThread().getName());
LogUtil.d("ttt44444444444"+Thread.currentThread().getName());
}
}).start();
结果
ttt11111111111Thread-155 ttt22222222222Thread-155 ttt33333333333Thread-155 ttt44444444444Thread-155 ttt55555555main
可见这种方式可以快速切换线程,从log日志来看,切换到主线程不会阻塞子线程。
4、viewPost()
textView=(TextView)findViewById(R.id.tv);
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
textView.post(newRunnable(){
@Override
publicvoidrun(){
textView.setText("Ui更新了");
}
});
}
}).start();
总结:
1、其实上面的四种方式都可归结于一种方式:handler用于Android线程之间的通信。
2、为什么android要求只能在UI线程进行UI操作?主要还是为了避免多线程造成的并发的问题。在单线程操作UI是安全的。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!