文章来源:http://www.2cto.com/kf/201302/190591.html

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回调函数中调用更新界面显示的函数。 界面:
public class MainActivity extends Activity {      private EditText UITxt;      private Button updateUIBtn;      private UIHandler UIhandler;      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          UITxt = (EditText)findViewById(R.id.ui_txt);          updateUIBtn = (Button)findViewById(R.id.update_ui_btn);          updateUIBtn.setOnClickListener(new View.OnClickListener() {              public void onClick(View v) {                  // TODO Auto-generated method stub                  UIhandler = new UIHandler();                  UIThread thread = new UIThread();                  thread.start();              }          });      }      @Override      public boolean onCreateOptionsMenu(Menu menu) {          getMenuInflater().inflate(R.menu.activity_main, menu);          return true;      }      private class UIHandler extends Handler{          @Override          public void handleMessage(Message msg) {              // TODO Auto-generated method stub              super.handleMessage(msg);              Bundle bundle = msg.getData();              String color = bundle.getString("color");              UITxt.setText(color);          }      }      private class UIThread extends Thread{          @Override          public void run() {              try {                  Thread.sleep(3000);              } catch (InterruptedException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }              Message msg = new Message();              Bundle bundle = new Bundle();              bundle.putString("color", "黄色");              msg.setData(bundle);              MainActivity.this.UIhandler.sendMessage(msg);          }      }  }  

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

来自为知笔记(Wiz)



更多相关文章

  1. 永久改变android 模拟器分区大小
  2. android按钮监听器的四种技术
  3. 关于android生命周期那点事
  4. appium測試中验证toast的正确性
  5. Android判断当前线程是否是主线程的方法
  6. Android(安卓)HandlerThread类,Bundle的使用
  7. Android(安卓)Native层开发Camera应用的方法
  8. Android使用Google提供的地图实现定位时LocationListener的各个
  9. Android中DatePicker只显示年月的方法

随机推荐

  1. 多线程学习(二) 多线程创建4种方式
  2. 多线程学习(一) 线程与进程的理解
  3. Error reading device /dev/bakupvg/baku
  4. 个人理解简单工厂模式和策略模式的区别
  5. 多线程学习(三)多线程开发带来的问题与解决
  6. 为什么说Python会成为最流行的编程语言?
  7. IPython6.0发布:放弃支持Python2.7
  8. Django2.0即将带来3个重要特性
  9. 多线程学习(三)那些队列可用于线程池
  10. 用翻译赚钱,翻译社规则调整