zoukankan      html  css  js  c++  java
  • handler使用(一)

    一、Handler的定义:

         主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
    解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

    二、Handler一些特点

            handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
            它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
            Handler中分发消息的一些方法
            post(Runnable)
            postAtTime(Runnable,long)
            postDelayed(Runnable long)
            sendEmptyMessage(int)
            sendMessage(Message)
            sendMessageAtTime(Message,long)
            sendMessageDelayed(Message,long)
            以上post类方法允许你排列一个Runnable对象到主线程队列中,
            sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

    三、Handler实例
    • handler使用Message

    1.定义一个Handler

    2.重写消息处理函数

    3.发送消息

    //创建简单的View  
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.view.View;
    public class BounceView extends View {
    	float x = 40;
    	public BounceView(Context context) {
    		super(context);
    	}
    	@Override
    	protected void onDraw(Canvas canvas) {
    		x += 10;
    		Paint mPaint = new Paint();
    		mPaint.setAntiAlias(true);
    		mPaint.setColor(Color.GREEN);
    		canvas.drawCircle(x, 40, 40, mPaint);
    	}
    }
    //创建Activity  
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Window;
    
    public class TestHandler extends Activity {
    	protected static final int GUIUPDATEIDENTIFIER = 0x101;
    	Thread myRefreshThread = null;
    	BounceView myBounceView = null; // 1.定义一个Handler(一般更新View)
    	Handler myHandler = new Handler() {
    		// 2.重写消息处理函数
    		public void handleMessage(Message msg) {
    			switch (msg.what) { // 判断发送的消息
    			case TestHandler.GUIUPDATEIDENTIFIER:
    				// 更新View
    				myBounceView.invalidate();
    				break;
    			}
    			super.handleMessage(msg);
    		}
    	};
    
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    		this.myBounceView = new BounceView(this);
    		this.setContentView(this.myBounceView);
    		new Thread(new myThread()).start();
    	}
    
    	class myThread implements Runnable {
    		public void run() {
    			while (!Thread.currentThread().isInterrupted()) {
    				// 3.发送消息
    				Message message = new Message();
    				// 发送消息与处理函数里一致
    				message.what = TestHandler.GUIUPDATEIDENTIFIER;
    				// 内部类调用外部类的变量
    				TestHandler.this.myHandler.sendMessage(message);
    				try {
    					Thread.sleep(100);
    				} catch (InterruptedException e) {
    					Thread.currentThread().interrupt();
    				}
    			}
    		}
    	}
    }
    • 利用handler.post()更新UI

    1.创建一个Handler

    2.调用Handler.post(Runnable r)方法

    3.Runnable运行在UI所在线程,所以可以直接调用View.invalidate()

    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    public class TestHandler extends Activity {
    	private MyView myView;
    	private Handler mHandler;
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		myView = new MyView(this);
    		// 创建一个Handler
    		mHandler = new Handler();
    		// 调用Handler.post(Runnable r)方法
    		mHandler.post(new Runnable() {
    			@Override
    			public void run() {
    				// 直接调用View.invalidate(),更新组件
    				myView.invalidate();
    				// 延迟5毫秒后执行线程
    				mHandler.postDelayed(this, 5);
    			}
    		});
    		setContentView(myView);
    	}
    	class MyView extends View {
    		private float x = 0f;
    		public MyView(Context context) {
    			super(context);
    		}
    		protected void onDraw(Canvas canvas) {
    			super.onDraw(canvas);
    			x += 1;
    			Paint mPaint = new Paint();
    			mPaint.setColor(Color.BLUE);
    			canvas.drawRect(x, 40, x + 40, 80, mPaint);
    		}
    	}
    }
    • 在线程里直接更新UI
     //在新线程里更新UI,可以直接使用postInvalidate()  
     
    public void onCreate(Bundle savedInstanceState) {               
    	super.onCreate(savedInstanceState);               
    	this.requestWindowFeature(Window.FEATURE_NO_TITLE);                      
    	myView = new MyView(this);          
      this.setContentView(this.myView);               
      new Thread(new myThread()).start();       
    }              
    class myThread implements Runnable {              
    	public void run() {                 
    		while (!Thread.currentThread().isInterrupted()) {                     
    			try {                       
    				//更新UI                     
    				myView.postInvalidate();                        
    				Thread.sleep(100);                       
    				} catch (InterruptedException e) {                           
    					Thread.currentThread().interrupt();                      
    				}                  
    			}              
    	}        
    }   
  • 相关阅读:
    Palindrome Partitioning
    triangle
    Populating Next Right Pointers in Each Node(I and II)
    分苹果(网易)
    Flatten Binary Tree to Linked List
    Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)
    iOS系统navigationBar背景色,文字颜色处理
    登录,注销
    ios 文字上下滚动效果Demo
    经常崩溃就是数组字典引起的
  • 原文地址:https://www.cnblogs.com/blueofsky/p/2303484.html
Copyright © 2011-2022 走看看