`

android > Handler, Runnable, Message, HandlerThread

 
阅读更多

Handler 存在 2 个队列, 一个是线程Runnable , 一个是消息Message,

Handler 的作用 可以把 线程 排进 列队中, 然后 先进 先出,

其中 Handler handler = new Handler();

是操作 线程,比如  启动 handler.post(线程)  , 杀死 handler.removeCallbacks(线程)

 

在线程中(Runnable) 可以做 线程中的具体实现某种功能的全部过程,

比如下面这个 是 将 进度条 每 10 秒 前进一次

 

public class HandlerActivity extends Activity {
    /** Called when the activity is first created. */
	
	private Button b_start;
	private ProgressBar bar_1;
	private int i=0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        b_start = (Button)findViewById(R.id.bu_start);
        bar_1 = (ProgressBar)findViewById(R.id.bar_1);        
        b_start.setOnClickListener(new StartButtonListener());        
        bar_1.setMax(100);        
    }    
    Handler handler = new Handler();  //管理 线程,执行线程    
    class StartButtonListener implements OnClickListener{
    	public void onClick(View v) {
    		// TODO Auto-generated method stub    		
    		handler.post(updateThread);		//启动线程    		
    	}    	
    }    
    // java 实现 多线程 使用的 Runable 类 线程的具体功能 
    Runnable updateThread = new Runnable() {
		public void run() {
			// TODO Auto-generated method stub			
			i = i + 10;
			bar_1.setProgress(i);//设置进度条的进度值
                       // 重复延迟 1000 启动 线程 undateThread
                        handler.postDelayed(updateThread, 1000);
			if(i == 100){
				Toast.makeText(HandlerActivity.this, "进度条已经到100了", Toast.LENGTH_LONG).show();
				handler.removeCallbacks(updateThread); //去掉 线程
			}
		}
	};   
    
}

--------------------------------------------------------------------------------

 

然后是 message  调用的是 handler 里面的 handleMessage 方法

    Handler updateHandler = new Handler(){
    	public void handleMessage(Message msg) {
  		//干些什么呢
    		//bar_1.setProgress(msg.arg1);  
    		//updateHandler.post(updateThread);   // 执行了Runnable  	updateThread
         };    	
    };     

 

//从updateHandler获得/关联msg 对象 但 没有执行 updateHandler
Message msg = updateHandler.obtainMessage(); 

 

msg.arg1 = i;   //给msg 的 arg1 变量 赋值 
 
//将msg 的值 压入 到  updateHandler 中, 并 执行 updateHandler 一次
updateHandler.sendMessage(msg); 

 

 

try {	// 等待 3000 毫秒
	Thread.sleep(3000);				
}catch (InterruptedException e) {
	// TODO: handle exception
       e.printStackTrace();
}	

 

android.os.Process.killProcess(android.os.Process.myPid());  

可以杀死 线程, 防止  即便通过 removeCallbacks 线程还在后台跑​

或者 用 System.exit(0)

当然这样做的话 整个 程序 也 finish 掉了

 

有一点 handler 在在 主 线程中 执行 , 如果要新建线程 要使用 handlerThread 或者 new Thread

 

Thread t = new Thread(updateThread);
 t.start();

 

作用 的话 替换掉 handler.post(updateThread); 就不用这个了。

------------------------------------------------------------------------------------------------------------------------------

HandlerThread: (循环从队列中处理消息的类,并新建线程)

 

其中 getLooper 返回一个关联的线程(handlerthread) 的循环 队列

 

 

​其实 就是 先新建一个 handlerThread , 就是相当 新建了线程, 然后再 新建一个handler 使用 之前新建的handlerthread ,

 

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        System.out.println("Activity thread id = " + Thread.currentThread().getId());        
        //新建handlerthread 线程
        HandlerThread newthread = new HandlerThread("handler_thread");
        newthread.start();        
        //新建hander
        Handler hander = new Handler(newthread.getLooper()){
        	@Override
        	//声明handlemessage
        	public void handleMessage(Message msg) {
        		// TODO Auto-generated method stub
        		super.handleMessage(msg);        
        		//取得bundle
        		Bundle receiveBundle = msg.getData();
        		int age = receiveBundle.getInt("age");
        		String name = receiveBundle.getString("name");
        		
        		System.out.println("Activity thread id = " + Thread.currentThread().getId());
        		System.out.println("Name  = " + name + " , Age = " + age);
        	}        	
        };        
        Message msg = hander.obtainMessage(); //关联Message
        // 新建budnle 并赋值
        Bundle bundle = new Bundle();
        bundle.putInt("age", 20);
        bundle.putString("name", "Jhon");        
        msg.setData(bundle);
        
        msg.sendToTarget();	//传值给 handerMessage 并 启用 hander->handleMessage
    }
 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics