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是安全的。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!