Android 更新UI的两种方法——handler和runOnUiThread()

本文介绍了在Android开发中更新UI的两种方法:使用Handler类和runOnUiThread()方法。这两种方法允许开发者从非UI线程安全地更新UI元素,避免了CalledFromWrongThreadException异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 更新UI的两种方法——handler和runOnUiThread()

在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示常会报错。抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)

话不多说,贴出下面的代码

方法一:

在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例, 在这个Handler实例的handleMessage回调函数中调用更新界面显示的函数。


界面:


[html] view plain copy
  1. <spanstyle="font-size:14px;">publicclassMainActivityextendsActivity{
  2. privateEditTextUITxt;
  3. privateButtonupdateUIBtn;
  4. privateUIHandlerUIhandler;
  5. @Override
  6. publicvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. UITxt=(EditText)findViewById(R.id.ui_txt);
  10. updateUIBtn=(Button)findViewById(R.id.update_ui_btn);
  11. updateUIBtn.setOnClickListener(newView.OnClickListener(){
  12. publicvoidonClick(Viewv){
  13. //TODOAuto-generatedmethodstub
  14. UIhandler=newUIHandler();
  15. UIThreadthread=newUIThread();
  16. thread.start();
  17. }
  18. });
  19. }
  20. @Override
  21. publicbooleanonCreateOptionsMenu(Menumenu){
  22. getMenuInflater().inflate(R.menu.activity_main,menu);
  23. returntrue;
  24. }
  25. privateclassUIHandlerextendsHandler{
  26. @Override
  27. publicvoidhandleMessage(Messagemsg){
  28. //TODOAuto-generatedmethodstub
  29. super.handleMessage(msg);
  30. Bundlebundle=msg.getData();
  31. Stringcolor=bundle.getString("color");
  32. UITxt.setText(color);
  33. }
  34. }
  35. privateclassUIThreadextendsThread{
  36. @Override
  37. publicvoidrun(){
  38. try{
  39. Thread.sleep(3000);
  40. }catch(InterruptedExceptione){
  41. //TODOAuto-generatedcatchblock
  42. e.printStackTrace();
  43. }
  44. Messagemsg=newMessage();
  45. Bundlebundle=newBundle();
  46. bundle.putString("color","黄色");
  47. msg.setData(bundle);
  48. MainActivity.this.UIhandler.sendMessage(msg);
  49. }
  50. }
  51. }</span>
更新后:

方法二:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程

[html] view plain copy
  1. FusionField.currentActivity.runOnUiThread(newRunnable()
  2. {
  3. publicvoidrun()
  4. {
  5. Toast.makeText(getApplicationContext(),,"UpdateMyUI",
  6. Toast.LENGTH_LONG).show();
  7. }
  8. });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值