android handler Message 的使用备忘录

来源:互联网 发布:山东省网络问政 编辑:程序博客网 时间:2024/04/30 09:38

在使用handler和message时,可以参考这两篇文章和文章,有两点需要记住:

1 每个线程只能有一个looper

2 主线程默认有looper

在向主线程的looper发送消息时,可以在多线程中采用如下方法,其中Message携带了一个Bundle的data,可以传递参数等:

 while(playStatus){                                      try {                        //绑定成功才能开始更新UI                      if(mBound){                                                    //发送消息,要求更新UI                                                    Message msg = new Message();                          data.clear();                                            progress = mService.getProgress();                          msg.what = 0;                                                    data.putDouble("progress", progress);                          msg.setData(data);                          mHandler.sendMessage(msg);                      }                      Thread.sleep(milliseconds);                        //Thread.currentThread().sleep(milliseconds);                        //每隔100ms更新一次UI                                        } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }    
但是看了第二篇参考才知道,获得Message的构造方法最好的方式是调用Message.obtain() 和 Handler.obtainMessage()方法。具体的可以看一下obtain()的源码,学渣就不说了。

还有在实际的编码中,学渣遇到了如下问题:

<pre name="code" class="java"> public class MyThread implements Runnable{                    //用来向UI线程传递进度的值          Bundle data = new Bundle();                    //更新UI间隔时间          int milliseconds = 100;          double progress;  //Message 没有每次都new,而是想使用同一个对象,出错Message msg = new Message();          @Override          public void run() {              // TODO Auto-generated method stub                            //用来标识是否还在播放状态,用来控制线程退出              while(playStatus){                                      try {                        //绑定成功才能开始更新UI                      if(mBound){                                                    //发送消息,要求更新UI                          data.clear();                                            progress = mService.getProgress();                          msg.what = 0;                                                    data.putDouble("progress", progress);                          msg.setData(data);                          mHandler.sendMessage(msg);                      }                      Thread.sleep(milliseconds);                        //Thread.currentThread().sleep(milliseconds);                        //每隔100ms更新一次UI                                        } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                              }          }                }  


在上述代码中Messag没有使用new或者obtain(),而是使用同一个Message对象,结果出错,不知道为什么,难道是MessageQueue在取Message后会销毁这个Message对象么,求指导。。。


0 0
原创粉丝点击