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回调函数中调用更新界面显示的函数。 界面: Android 更新UI的两种方法——handler和runOnUiThread( [ html] <span style="font-size:14px;">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); } } }</span> 更新后:www.2cto.com Android 更新UI的两种方法——handler和runOnUiThread( 方法二:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程 [html] FusionField.currentActivity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(getApplicationContext(), , "Update My UI", Toast.LENGTH_LONG).show(); } });

更多相关文章

  1. android在一个app程序中,打开另一个app的方法
  2. 小米5手机Android运行程序闪退出错解决方法
  3. Android 查看SHA1值的方法
  4. Android 更新UI 只能在主线程?
  5. 如何正确实现Android启动屏画面的方法(避免白屏)
  6. Android中Failed to 。。。。。。timeout错误的解决方法

随机推荐

  1. Android(安卓)插件化 动态升级
  2. Android的风暴前夕
  3. Android中线程的应用
  4. Android的ps命令介绍和技巧
  5. Android中的Margin和Padding及Android支
  6. android:layout_gravity 和 android:grav
  7. Android(安卓)插件化 动态升级
  8. Android性能调优总结
  9. 简析Android对Linux内核的改动
  10. Android中ContentProvider详解