Android中的Handler

1、主线程给自己发送Message

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Looper looper = Looper.getMainLooper(); // 主线程的Looper对象,Looper looper2 = Looper.myLooper(); // looper == looper2
                // 这里以主线程的Looper对象创建了handler,
                // 所以,这个handler发送的Message会被传递给主线程的MessageQueue。
                mHandler = new LocalHandler(looper);
                mHandler.removeMessages(0);

                // 构建Message对象
                // 第一个参数:是自己指定的message代号,方便在handler选择性地接收
                // 第二三个参数没有什么意义
                // 第四个参数需要封装的对象
                Message msg = mHandler.obtainMessage(1, 2, 3, "主线程发消息了");

                mHandler.sendMessage(msg); // 发送消息
            }
        });
    }

    class LocalHandler extends Handler {

        public LocalHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    }
}

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                mHandler.obtainMessage(1, "主线程发消息了").sendToTarget();
            }
        });
    }
}

2、其他线程给主线程发送Message

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 可以看出这里启动了一个线程来操作消息的封装和发送的工作
                // 这样原来主线程的发送就变成了其他线程的发送,简单吧?呵呵
                new LocalThread().start();
            }
        });
    }

    // 加了一个线程类
    class LocalThread extends Thread {

        @Override
        public void run() {
            Looper looper = Looper.getMainLooper(); // 主线程的Looper对象,// Looper looper2 = Looper.myLooper(); // looper2 == null
            // 这里以主线程的Looper对象创建了handler,
            // 所以,这个handler发送的Message会被传递给主线程的MessageQueue。
            mHandler = new LocalHandler(looper);

            // 构建Message对象
            // 第一个参数:是自己指定的message代号,方便在handler选择性地接收
            // 第二三个参数没有什么意义
            // 第四个参数需要封装的对象
            Message msg = mHandler.obtainMessage(1, 2, 3, "其他线程发消息了");

            mHandler.sendMessage(msg); // 发送消息
        }
    }

    class LocalHandler extends Handler {

        public LocalHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    }
}

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private final Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                new LocalThread().start();
            }
        });
    }

    // 加了一个线程类
    class LocalThread extends Thread {

        @Override
        public void run() {
            mHandler.obtainMessage(1, "其他线程发消息了").sendToTarget();
        }
    }
}

3、主线程给其他线程发送Message

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mThreadHandler;
    private Handler mMainHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

                // 启动线程
        new MyThread().start();

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 这里handler的实例化在线程中
                // 线程启动的时候就已经实例化了
                Message msg = mThreadHandler.obtainMessage(1, "主线程发送的消息");
                mThreadHandler.sendMessage(msg);
            }
        });
    }

    class MyHandler extends Handler {

        public MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
        }
    }

    class MyThread extends Thread {

        @Override
        public void run() {
            Looper.prepare(); // 创建该线程的Looper对象,用于接收消息

            // 注意了:这里的handler是定义在主线程中的哦,呵呵,
            // 前面看到直接使用了handler对象,是不是在找,在什么地方实例化的呢?
            // 现在看到了吧???呵呵,开始的时候实例化不了,因为该线程的Looper对象
            // 还不存在呢。现在可以实例化了
            // 这里Looper.myLooper()获得的就是该线程的Looper对象了
            mThreadHandler = new ThreadHandler(Looper.myLooper());


            // 这个方法,有疑惑吗?
            // 其实就是一个循环,循环从MessageQueue中取消息。
            // 不经常去看看,你怎么知道你有新消息呢???
            Looper.loop();
        }

        // 定义线程类中的消息处理类
        class ThreadHandler extends Handler {
            public ThreadHandler(Looper looper) {
                super(looper);
            }

            @Override
            public void handleMessage(Message msg) {
                // 这里对该线程中的MessageQueue中的Message进行处理
                // 这里我们再返回给主线程一个消息
                mMainHandler = new MyHandler(Looper.getMainLooper());
                Message msg2 = mMainHandler.obtainMessage(1, 1, 1, "子线程收到:" + (String) msg.obj);
                mMainHandler.sendMessage(msg2);
            }
        }
    }
}
public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mThreadHandler;

    private final Handler mMainHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 11:
                    Log.d("gg", (String) msg.obj + msg.what);
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        // 启动线程
        new MyThread().start();

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 这里handler的实例化在线程中,不知道何时创建成功,所以在使用前先判断下,否则可能crash
                if (mThreadHandler != null) {
                    mThreadHandler.obtainMessage(1, "主线程发送的消息").sendToTarget();
                }
            }
        });
    }

    class MyThread extends Thread {

        @Override
        public void run() {
            Looper.prepare(); // 创建该线程的Looper对象,用于接收消息

            // 注意了:这里的handler是定义在主线程中的哦,呵呵,
            // 前面看到直接使用了handler对象,是不是在找,在什么地方实例化的呢?
            // 现在看到了吧???呵呵,开始的时候实例化不了,因为该线程的Looper对象还不存在呢。现在可以实例化了
            // 这里Looper.myLooper()获得的就是该线程的Looper对象了
            mThreadHandler = new ThreadHandler(Looper.myLooper());

            // 这个方法,有疑惑吗?
            // 其实就是一个循环,循环从MessageQueue中取消息。
            // 不经常去看看,你怎么知道你有新消息呢???
            Looper.loop();
        }

        // 定义线程类中的消息处理类
        class ThreadHandler extends Handler {

            public ThreadHandler(Looper looper) {
                super(looper);
            }

            @Override
            public void handleMessage(Message msg) {
                // 这里对该线程中的MessageQueue中的Message进行处理
                // 这里我们再返回给主线程一个消息
                switch (msg.what) {
                    case 1:
                        Log.d("gg", (String) msg.obj + msg.what);
                        mMainHandler.obtainMessage(11, "子线程收到:" + (String) msg.obj).sendToTarget();
                        break;
                }

            }
        }
    }
}
// 09-02 16:30:10.658: D/gg(7800): 主线程发送的消息1
// 09-02 16:30:10.658: D/gg(7800): 子线程收到:主线程发送的消息11
public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mThreadHandler;

    private final Handler mMainHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 11:
                    Log.d("gg", (String) msg.obj + msg.what);
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    };

    // 定义线程类中的消息处理类
    class ThreadHandler extends Handler {

        public ThreadHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            // 这里对该线程中的MessageQueue中的Message进行处理
            // 这里我们再返回给主线程一个消息
            switch (msg.what) {
                case 1:
                    Log.d("gg", (String) msg.obj + msg.what);
                    mMainHandler.obtainMessage(11, "子线程收到:" + (String) msg.obj).sendToTarget();
                    break;
            }
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        HandlerThread handlerThread = new HandlerThread("xiancheng");
        handlerThread.start();
        mThreadHandler = new ThreadHandler(handlerThread.getLooper());

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 这里handler的实例化在线程中,不知道何时创建成功,所以在使用前先判断下,否则可能crash
                if (mThreadHandler != null) {
                    mThreadHandler.obtainMessage(1, "主线程发送的消息").sendToTarget();
                }
            }
        });
    }
}

4、其他线程给自己发送Message 

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mThreadHandler;
    private Handler mMainHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 启动线程
                new MyThread().start();
            }
        });
    }

    class MyHandler extends Handler {

        public MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            mText.setText((String) msg.obj);
        }
    }

    class MyThread extends Thread {

        @Override
        public void run() {
            Looper.prepare(); // 创建该线程的Looper对象
            // 这里Looper.myLooper()获得的就是该线程的Looper对象了
            mThreadHandler = new ThreadHandler(Looper.myLooper());
            Message msg = mThreadHandler.obtainMessage(1, "我自己");
            mThreadHandler.sendMessage(msg);

            Looper.loop();
        }

        // 定义线程类中的消息处理类
        class ThreadHandler extends Handler {

            public ThreadHandler(Looper looper) {
                super(looper);
            }

            @Override
            public void handleMessage(Message msg) {
                // 这里对该线程中的MessageQueue中的Message进行处理
                // 这里我们再返回给主线程一个消息
                // 加入判断看看是不是该线程自己发的信息
                if (msg.what == 1) {
                    mMainHandler = new MyHandler(Looper.getMainLooper());
                    Message msg2 = mMainHandler.obtainMessage(1, "禀告主线程:我收到了自己发给自己的Message");
                    mMainHandler.sendMessage(msg2);
                }
            }
        }
    }
}
public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mHandler;
    private Handler mMainHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // 启动线程
                new MyThread().start();
            }
        });
    }

    class MainHandler extends Handler {
        public MainHandler(Looper looper) {
            super(looper);
        }
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 11:
                    Log.d("gg", (String) msg.obj + msg.what);
                    mText.setText((String) msg.obj);
                    break;
            }
        }
    }

    class MyThread extends Thread {
        @Override
        public void run() {
            Looper.prepare(); // 创建该线程的Looper对象
            // 这里Looper.myLooper()获得的就是该线程的Looper对象了
            // Looper looper = Looper.getMainLooper();
            // Looper looper2 = Looper.myLooper(); // looper2 != looper
            mHandler = new ThreadHandler(Looper.myLooper());
            mHandler.obtainMessage(1, 2, 3, "我自己").sendToTarget();
            Looper.loop();
        }

        // 定义线程类中的消息处理类
        class ThreadHandler extends Handler {

            public ThreadHandler(Looper looper) {
                super(looper);
            }

            @Override
            public void handleMessage(Message msg) {
                // 这里对该线程中的MessageQueue中的Message进行处理
                // 这里我们再返回给主线程一个消息
                // 加入判断看看是不是该线程自己发的信息
                switch (msg.what) {
                    case 1:
                        Log.d("gg", (String) msg.obj + msg.what);
                        mMainHandler = new MainHandler(Looper.getMainLooper());
                        mMainHandler.obtainMessage(11, 22, 33, "禀告主线程:我收到了自己发给自己的Message").sendToTarget();
                        break;
                }
            }
        }
    }
}
// 09-02 16:06:42.322: D/gg(7001): 我自己1
// 09-02 16:06:42.338: D/gg(7001): 禀告主线程:我收到了自己发给自己的Message11

class LooperThread extends Thread {
    public Handler mHandler;

    @Override
    public void run() {
        Looper.prepare();

        mHandler = new Handler() {

            @Override
            public void handleMessage(Message msg) {

            }
        };

        Looper.loop();
    }
}


//通过Handler启动线程    
HandlerThread handlerThread = new HandlerThread("threadone");  
handlerThread.start();  
mHandler =  new Handler(handlerThread.getLooper());//那么这个Handler对象就是与HandlerThread这个线程绑定了(这时就不再是与UI线程绑定了,这样它处理耗时操作将不会阻塞UI)
mHandler.post(mRunnable);    

private Runnable mRunnable = new Runnable() {   
	@Override
	public void run() {    
		count++;    
		//setTitle("" +count);    
		//每2秒执行一次    
		mHandler.postDelayed(mRunnable, 2000);    
    }    
};    

是MessageQueue的管理者。

每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare()函数来实现的。同时每一个Looper对象和一个线程关联。
通过调用Looper.myLooper()可以获得当前线程的Looper对象
创建一个Looper对象时,会同时创建一个MessageQueue对象。除了主线程有默认的Looper,其他线程默认是没有MessageQueue对象的,所以,不能
接受Message。
如需要接受,自己定义一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。
Looper从MessageQueue中取出Message然后,交由Handler的handleMessage进行处理。处理完成后,调用Message.recycle()将其放入Message Pool中。

http://www.eoeandroid.com/thread-49595-1-1.html?_dsign=7a783b06


Android 之 Looper、MessageQueue、Handler 与消息循环

Handler主要用来发送消息和处理消息。每个handler实例都对应着一个线程和该线程的消息队列。
当你创建一个handler对象时,该handler对象就属于创建它的线程,并和该线程的消息队列绑定,比如在主线程中创建handler对象,那么该handler就只属于主线程,并且和主线程的消息队列绑定。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值