zoukankan      html  css  js  c++  java
  • Handler总结

    一、整体工程图


    二、activity_handler.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:orientation="vertical">
    
    
    	<Button android:text="Handler Lab1" android:id="@+id/buttonHandlerLab1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    	<Button android:text="Handler Lab2" android:id="@+id/buttonHandlerLab2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    	<Button android:text="Handler Lab3" android:id="@+id/buttonHandlerLab3" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    	<Button android:text="Handler Lab4.1" android:id="@+id/buttonHandlerLab4_1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    	<Button android:text="Handler Lab4.2" android:id="@+id/buttonHandlerLab4_2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    	<Button android:text="Handler Lab5.1" android:id="@+id/buttonHandlerLab5_1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    	<Button android:text="Handler Lab5.2" android:id="@+id/buttonHandlerLab5_2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    </LinearLayout>
    


    三、HandlerActivity.java

    package com.jltxgcy.handlerdemo;
    
    
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.HandlerThread;
    import android.os.Looper;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Toast;
    import android.os.Process;
    
    public class HandlerActivity extends Activity {
    	private static final String TAG="jltxgcy";
    	private final String HANDLER_KEY = "jltxgcy"  ;
    	private Handler lab1Handler1 ;
    	private Handler lab1Handler2 ;
    	private Handler lab2Handler  ;
    	private Handler lab3Handler;
    	private Handler lab4Handler;
    	private Handler lab5_1Handler = new Handler();  
    	private Handler lab5_2Handler;
    	private Looper mLooper;
    	private String result;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_handler);
        	lab1Handler2 = new Handler(){
    
    			@Override
    			public void handleMessage(Message msg) {
    				super.handleMessage(msg);
    				Toast.makeText(HandlerActivity.this, "[Main Thread]Handler2 Get the message: "+msg.getData().getString(HANDLER_KEY), 5000).show()  ;
    			}
    			
    		} ;
    		lab1Handler1 = new Handler(){
    
    			@Override
    			public void handleMessage(Message msg) {
    				super.handleMessage(msg);
    				result=msg.getData().getString(HANDLER_KEY);
    				Toast.makeText(HandlerActivity.this, "[Main Thread]Handler1 Get the message: "+msg.getData().getString(HANDLER_KEY), 5000).show()  ;
    			}
    			
    		} ;
    		
    
    
    		//Handler Lab1
    		findViewById(R.id.buttonHandlerLab1).setOnClickListener(new OnClickListener(){
    
    			@Override
    			public void onClick(View v) {
    				new Thread(new Runnable(){
    
    					@Override
    					public void run() {
    						
    						lab1Handler1.sendMessage(defineNewMessage("Lab1")) ;
    						//try to use mainHanlder2 to send meesage and receive . 
    						//mainHandler2.sendMessage(defineNewMessage("Lab1")) ;
    						
    					}
    					
    				}).start();
    				
    			}
    			
    		}) ;
    		
    		findViewById(R.id.buttonHandlerLab2).setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				new Thread(new Runnable(){
    					
    					@Override
    					public void run() {
    						lab2Handler = new Handler(Looper.getMainLooper())
    						{
    
    							@Override
    							public void handleMessage(Message msg) {
    								// TODO Auto-generated method stub
    								super.handleMessage(msg);
    								Log.d(TAG, "Get the message: "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler")  ;
    							}
    							
    						};
    						lab2Handler.sendMessage(defineNewMessage("Lab2")) ;
    						lab3Handler.sendMessage(defineNewMessage("Lab3")) ;
    						
    						
    					}
    					
    				}).start() ;
    				
    			}
    		});
    		
    		findViewById(R.id.buttonHandlerLab3).setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				new Thread(new Runnable(){
    					
    					@Override
    					public void run() {
    						// TODO Auto-generated method stub
    						Looper.prepare();
    						lab3Handler = new Handler(){
    
    							@Override
    							public void handleMessage(Message msg) {
    								// TODO Auto-generated method stub
    								super.handleMessage(msg);
    								Log.d(TAG, "Get the message from "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler")  ;
    							}
    						} ;						
    						Looper.loop();
    					}
    					
    				}).start() ;
    				
    			}
    		});
    		
    
    		findViewById(R.id.buttonHandlerLab4_1).setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				HandlerThread thread = new HandlerThread("ServiceStartArguments",
    			            Process.THREAD_PRIORITY_BACKGROUND);
    			    thread.start();
    			    
    			    // Get the HandlerThread's Looper and use it for our Handler 
    			    mLooper = thread.getLooper();
    			    lab4Handler = new Handler(mLooper){
    			    	@Override
    					public void handleMessage(Message msg) {
    						// TODO Auto-generated method stub
    						super.handleMessage(msg);
    			        	Log.d(TAG, "Start message "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler")  ;
    			        	try {
    							Thread.sleep(5*1000);
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    			        	Log.d(TAG, "Finish message "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler");
    					}
    			    };
    				lab4Handler.sendMessage(defineNewMessage("Lab4.1")) ;
    				lab4Handler.sendMessage(defineNewMessage("Lab4.2")) ;
    				
    			}
    		});
    		
    		findViewById(R.id.buttonHandlerLab4_2).setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				lab4Handler.removeMessages(1);
    				
    			}
    		});
    		
    		findViewById(R.id.buttonHandlerLab5_1).setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				lab5_1Handler.postDelayed(new MyRunnable(), 2000);
    				Log.d(TAG, ""+Thread.currentThread().getId());
    			}
    		});
    		
    		findViewById(R.id.buttonHandlerLab5_2).setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				HandlerThread handlerThread = new HandlerThread("myHandlerThread");  
    		        handlerThread.start();  
    		        lab5_2Handler = new Handler(handlerThread.getLooper());  
    		        lab5_2Handler.post(new MyRunnable());  
    		        Log.d(TAG,""+Thread.currentThread().getId());
    			}
    		});
        }
        
        private class MyRunnable implements Runnable {  
            public void run() {  
            	Log.d(TAG, "Runnable---The Thread is running");  
                Log.d(TAG, ""+Thread.currentThread().getId()); 
            }  
        }  
           
        private Message defineNewMessage(String messageContent)
    	{
    		Message returnMsg = new Message() ;
    		Bundle data = new Bundle() ;
    		data.putString(HANDLER_KEY, messageContent)  ;
    		returnMsg.setData(data)  ;
    		returnMsg.what=1;
    		return returnMsg ;
    	}
    }


    四、解析

            Handler Lab1,接受消息的Handler在主线程中定义,而且处理消息也在主线程中。发送消息在子线程中。

            Handler Lab2,接受消息的Handler在子线程中定义,而处理消息却在主线程中。发送消息在子线程中。

            Handler Lab3,接受消息的Handler在子线程中定义,而且处理消息也在子线程中。发送消息在主线程中。

            Hander  Lab4_1,接受消息的Handler在主线程中定义,而处理消息却在子线程中。发送消息在主线程中。

            Hander  Lab4_2,连续发送两条信息,结果如下,说明是一条信息结束后,才处理另一个信息

            

            如果在发送第一个消息没有Finish前,按下Hander  Lab4_2,那么第一个消息不会取消,第二个消息会取消。

            Hander  Lab5_1,延迟2秒钟,开启run中的方法。结果显示如下,说明没有开启新的线程。

           

            Hander  Lab5_2,结果显示如下,这回开启了新的线程。

            

            1、Hander子线程用于每隔多长时间,或者完成一项任务向主线程发送消息,主线程接受消息后,更新UI。

            2、Hander主线程负责向子线程发送消息,子线程接受消息后开始下载。

            3、postDelay用于比如闹钟要隔几分钟后启动。


    五、Message

              获取Message的两种方式,第一种比较易读,第二种比较简洁。

              1、Message msg =new Message();
                    msg.arg1=x;
                    msg.arg2=x;
                    msg.obj=x;
                    msg.replyTo=x;
                    msg.what=x;
                    msg.setData(Bundle bundle);
              2、Message msg =Handler.obtain(Handler h, int what, int arg1, int arg2, Object obj);
                    msg.replyTo=x;
    		              msg.setData(Bundle bundle); 


     

       


  • 相关阅读:
    c3p0死锁
    空间分析过程
    UUID.randomUUID().toString() 的作用
    ajax做的一些总结
    vue3组合式api
    引入高德地图
    高德地图做标记
    页面刷新回到顶部
    高德地图如何只显示中国地图,不显示国外地图
    vue使用高德地图错误 ‘AMapUI‘ is not defined , ‘AMap‘ is not defined 问题及解决。
  • 原文地址:https://www.cnblogs.com/pangblog/p/3281204.html
Copyright © 2011-2022 走看看