现在的位置: 首页 > 综合 > 正文

Android Handler

2014年01月20日 ⁄ 综合 ⁄ 共 4149字 ⁄ 字号 评论关闭

Handler定义:

1. 负责发送和处理消息。

2. 按计划发送消息或执行某个Runnable(使用post方法).

3. 从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程).

4. 通过post发送的Runnable对象会经过包装,包装成一个Message.

5. 线程间可通过两种方式Handler进行通信:message和Runnable对象,其结果实质都是将在Handler的队列中放入内容,message是放置信息,可以传递一些参数,Handler获取这些信息并将判度如何处理,而Runnable则是直接给出处理的方法。队列就是依次执行,Handler会处理完一个消息或者执行完某个处理在进行下一步,这样不会出现多个线程同时要求进行UI处理而引发的混乱现象。

 

Handler构造函数:

Handler();返回当前活动线程的handler, 如果当前有多个线程则无法返回handler

Handler(Callback callback); Callback是一个接口,有handleMessage (Message msg)方法需要实现。

Handler(Looper looper);

Handler(Looper looper, Callback callback);

 

Handler方法:

dispatchMessage(Message msg); 见线程如何处理MessageQueue中接收的消息

obtainMessage ();从消息池中返回一个新Message

hasMessages(int what);监测消息池中是否还有what值的消息

post(Runnable r);

removeCallbacks(Runnable r);

removeMessages(int what);

sendMessage(Message msg);

 

线程如何处理MessageQueue中接收的消息:

    在Looper的loop函数中循环取出MessageQueue的接收消息队列中的消息, 然后调用 Hander的dispatchMessage函数对消息进行处理,用户可以重写public void dispatchMessage(Message msg) 函数,控制消息处理。

 

Handler实例:

点击button按钮,handler发送一个消息,处理这个消息在text中显示“欢迎关注zhangflyf!”.

图示实例:

image

方法一:

handler发送一个message,接收到这个消息后,处理这个消息在text中显示“欢迎关注zhangflyf!”.

test3.java

package com.android.test3;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class test3 extends Activity {
    private Button button;
    private TextView text;
    private MyHandler handler;
   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        button = (Button)findViewById(R.id.button);
        text = (TextView)findViewById(R.id.text);
       
        OnClickListener listener  = new OnClickListener() {
            public void onClick(View v) {
                //发送一个message
                handler = new MyHandler();
                Message msg = handler.obtainMessage();
                handler.sendMessage(msg);
            }
        };       
        button.setOnClickListener(listener);
    }
   
    class MyHandler extends Handler{
        public void handleMessage(Message msg) {
            text.setText("欢迎关注zhangflyf!");
        }
       
    }
}

 

方法二:

实现runnable中run方法

test3_1.java

package com.android.test3;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class test3_1  extends Activity{
    private Button button;
    private TextView text;
    private Handler handler;
   
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        button = (Button)findViewById(R.id.button);
        text = (TextView)findViewById(R.id.text);
       
        OnClickListener listener  = new OnClickListener() {
            public void onClick(View v) {
                handler = new Handler();
               
                handler.post(new Runnable() {
                    public void run() {
                        text.setText("欢迎关注zhangflyf!");
                    }
                });
            }
        };       
        button.setOnClickListener(listener);
    }
   
}

 

方法三:

回调函数

test_2.java

package com.android.test3;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class test3_2  extends Activity implements OnClickListener, Callback{
    private Button button;
    private TextView text;
    private MyHandler handler;
   
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        button = (Button)findViewById(R.id.button);
        text = (TextView)findViewById(R.id.text);
       
        button.setOnClickListener(this);
    }

   
    public void onClick(View v) {   
        handler = new MyHandler(this);
    }

    public boolean handleMessage(Message msg) {
        text.setText("欢迎关注zhangflyf!");
        return true;
    }

    class MyHandler extends Handler{
       
        public MyHandler(Callback callback){
            callback.handleMessage(null);
        }
       
    }

}

抱歉!评论已关闭.