原文:http://lzyathere.blog.163.com/blog/static/5083446720139294839321/ 在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示常会报错。抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view) 但是,有时会碰到在非主UI线程更新视图的需要。这个时候我们有两种处理的方式。一种是Handler一种是Activity中的 runOnUiThread(Runnable )方法。对于第一中方法,是采用传递消息的方式,调用Handler中方法来处理消息更新视图。这种方式对于不是很频繁的调用是可取的。如果更新的较快,则消息处理会一直排队处理,这样显示会相对滞后。这个时候就可以考虑使用第二中方式,将需要执行的代码放到Runnable的run方法中,然后调用runOnUiThread()这个方法将Runnable的对象传入即可。
方法一:Handler实例 (1) 子类需要继承Handler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据
以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容
public class MyHandlerActivity extends Activity { Button button; MyHandler myHandler;
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handlertest);
button = (Button) findViewById(R.id.button); myHandler = new MyHandler(); // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据 // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象 // (2): 让一个动作,在不同的线程中执行.
// 它安排消息,用以下方法 // post(Runnable) // postAtTime(Runnable,long) // postDelayed(Runnable,long) // sendEmptyMessage(int) // sendMessage(Message); // sendMessageAtTime(Message,long) // sendMessageDelayed(Message,long) // 以上方法以 post开头的允许你处理Runnable对象 //sendMessage()允许你处理Message对象(Message里可以包含数据,)
MyThread m = new MyThread(); new Thread(m).start(); }
/** * 接受消息,处理消息 ,此Handler会与当前主线程一块运行 * */
class MyHandler extends Handler { public MyHandler() { }
public MyHandler(Looper L) { super(L); }
// 子类必须重写此方法,接受数据 @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub Log.d("MyHandler", "handleMessage......"); super.handleMessage(msg); // 此处可以更新UI Bundle b = msg.getData(); String color = b.getString("color"); MyHandlerActivity.this.button.append(color);
} }
class MyThread implements Runnable { public void run() {
try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Log.d("thread.......", "mThread........"); Message msg = new Message(); Bundle b = new Bundle();// 存放数据 b.putString("color", "我的"); msg.setData(b);
MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
} }
方法二:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程
Activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(getApplicationContext(), , "Update My UI", Toast.LENGTH_LONG).show(); } });

更多相关文章

  1. 【Android学习笔记】Android中Intent的应用方法探索
  2. [Android]_[ACtivity生命周期]
  3. Android(安卓)FFmpeg系列——4 子线程播放音视频
  4. 【Android】App自动更新之通知栏下载
  5. Android系统模拟位置的使用方法
  6. Android(安卓)MVP模式介绍和讲解
  7. android ResultReceiver用法
  8. JNI中调用JAVA各种方法详解
  9. Android面试题总结(五)Android基础篇

随机推荐

  1. Android(安卓)ImageView图片自适应
  2. Android中改变一个图片的透明度
  3. Android多屏幕适配
  4. Android(安卓)Native中Android.mk编译链
  5. Android中使用XStream解析XML
  6. 基于linux系统安装Android(安卓)Studio
  7. android SQLite 原理
  8. myEclipse8.5集成svn android svn使用
  9. Android录音时获取分贝值的方法代码实例
  10. Android驱动使用JNI调用