android handler Message 的使用备忘录

在使用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值