android中handlerthread与handler + thread区别

            工作之间随手写的,handler + thread是初学者喜欢用的,为了不影响ui线程,开辟一个新的thread进行耗时操作,操作结束后需要更新ui,就需要通过handler进行

sendmessage来与ui线程通信,提醒一下在创建handler的时候,大部分初学者没有注意到参数Looper,它是负责不断循环处理线程中的message.很多人会问我没有注意创建

looper啊,这是系统默认在ui线程中创建了一个looper,这个looper就是负责ui线程的消息。简单的说当你开辟新的线程处理完耗时操作发送message后,handler中

handleMessage()方法就在ui线程中执行。

          现在有一个场景,比如我发送请求想服务器下载图片,服务器返回图片后,我想把这张图片保存在本地,保存图片也是一个耗时操作,但是我不想在ui线程中执行保存操作,也不想重新开辟一个线程,简单的说图片请求与图片保存都在一个线程中执行就需要用到handlerthread,对于looper+handler+thread的关系不清的,可以看看其他博文,这里直接上代码了


public class MainActivity extends Activity {
	
	//默认创建一个handler帮顶在ui线程上
	private Handler handler = null;
	private Button mbutton = null;
	private HandlerThread handlerthread;
	private Handler secondhandler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.i("shao", "test  handler");
		mbutton = (Button)findViewById(R.id.shaobutton);
		mbutton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				//创建handlerthread
				handlerthread = new HandlerThread("shaohandler");
				handlerthread.start();    
				secondhandler = new Handler(handlerthread.getLooper(), new Handler.Callback() {   
				//这里的looper是开辟thread中的looper,专门负责这个线程的消息处理	
					@Override
					public boolean handleMessage(Message msg) {
						Log.i("shao", "SecondHandler.CallBack::::" + Thread.currentThread().getId());
						return false;
					}
				});
				secondhandler.post(new Runnable() {
					
					@Override
					public void run() {
						
						Log.i("shao", "SecondHandlerThread" + Thread.currentThread().getId());
						secondhandler.sendEmptyMessage(2);
						
					}
				});
				
				
				
				
			}
		});
		
		//主线程有默认的looper就是与主线程绑定 
		handler = new Handler(new Handler.Callback() {       //ui线程默认有自己的looper 
            @Override  
            public boolean handleMessage(Message msg) {  
                // TODO Auto-generated method stub  
            	Log.i("shao", "Handler.CallBack::::" + Thread.currentThread().getId());
                //System.out.println("Handler.CallBack::::" + Thread.currentThread().getId());  
                return false;  
            }  
        });
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Log.i("shao", "new thread::::" + Thread.currentThread().getId());
				//System.out.println("new thread::::" + Thread.currentThread().getId());
				handler.sendEmptyMessage(0);
			}
		}).start();
          
	}
   
	
看一下运行结果:

06-29 23:20:46.274: I/shao(817): test  handler
06-29 23:20:46.284: I/shao(817): new thread::::78
06-29 23:20:46.304: I/shao(817): Handler.CallBack::::1
06-29 23:20:55.194: I/shao(817): SecondHandlerThread79
06-29 23:20:55.204: I/shao(817): SecondHandler.CallBack::::79

这样就更加明白looper+thread+handler的关系了,可以更加深入理解



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值