在android中,用户自己创建的工作线程和UI主线程是不同的线程。handler 是android中一种消息的异步处理机制。在用户未给自己的工作线程创建Looper,即默认情况下,handler 会在主线程的Looper下进行消息处理,这时handler占用主线程。

   当用户在启动自己的工作线程时调用Looper.prepare(),这时创建了自己的Looper,当我们利用handler进行消息处理时,自己的工作线程将和主线程不是同一个线程。代码如下:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Demo1 extends Activity{
      
    private Button button1,button2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
        button1=(Button)findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                MyThread myThread=new MyThread();
                myThread.start();
                Log.i("main Thread UI id:",Thread.currentThread().getId()+"");
            }
        });
    }
    
    
    class MyHandler extends Handler {
        
        public MyHandler(Looper looper){
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            Log.i("handler thread id:",Thread.currentThread().getId()+"");    
        }    
    }
       
    class MyThread extends Thread {
         private MyHandler myHandler;
         private  String obj;
        public void run(){
              Looper myLopper ;
              Looper.prepare();
              myLopper=Looper.myLooper();
              myHandler=new MyHandler(myLopper);
               Log.i("my thread id:",""+Thread.currentThread().getId());
               obj="my thread";    
               myHandler.removeMessages(0);
              Message message=myHandler.obtainMessage(1,1,1,obj);
              myHandler.sendMessage(message);
              Looper.loop();
            
        }
        
    }
     
}

运行结果如下:

I/main Thread UI id:(  725): 1
I/my thread id:(  725): 8
I/handler thread id:(  725): 8

由此可见,当我们创建自己的Looper时,系统的handler将占用用户的工作线程。

 

 

更多相关文章

  1. Android-工作遭遇-音视频播放控制篇(2)
  2. Android中AsyncTask使用详解
  3. android Handler
  4. Android(安卓)Handler机制理解
  5. Android(安卓)的 Handler 总结
  6. Android(安卓)EventBus框架入门
  7. 深入理解android之IPC机制与Binder框架
  8. Android线程池使用
  9. Android(安卓)之 Handler总结

随机推荐

  1. 基于MQTT实现Android消息推送(Push)(2)
  2. android 有关怎么自己添加系统级服务 jav
  3. Android(安卓)网络(四) Retrofit学习笔记
  4. Android(安卓)UI Operation in Thread
  5. Android快速开发框架介绍
  6. Android事件处理分析+Android事件处理 +A
  7. Android(安卓)五子棋开发经验
  8. Android(安卓)SVG矢量资源的使用方法
  9. Android开发从入门到精通
  10. Android属性动画优化(更高效的使用属性动