主线程发送消息到工作线程,工作线程的步骤是固定为3步的。

        Looper.prepare();//步骤1,线程里使用handler必须这样写,
handler = new Handler(){//步骤2,先实例化handler
@Override
public void handleMessage(Message msg) {
String receiver = msg.obj.toString();
System.out.println("receiver:"+receiver+","+Thread.currentThread().getName());
}
};
Looper.loop();//步骤3 ,循环Looper

代码如下:

 package com.wyl.handler_mars;

 import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
/**
* 主线程发送消息,工作线程接收消息
* @author Wyl
*
*/
public class SecondActivity extends Activity implements OnClickListener{
Button btn_fasong;
Handler hand;
Message msg;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
btn_fasong = (Button) findViewById(R.id.btn_send);
tv = (TextView) findViewById(R.id.tv_01);
btn_fasong.setOnClickListener(this);
Thread t = new MyThread();
t.start();
}
@Override
public void onClick(View v) {
//hand = new Handler();//这一行尤其重要,如果不注释掉,那么下面的线程中就没法接收到消息,因为这行代码中又重新生成了一个handler对象,也就对应着不同的looper,所以就没法
Message msg = hand.obtainMessage();
msg.obj = "无语了。。。";
System.out.println("onClick()...发送:"+"无语了。。。");
hand.sendMessage(msg);//主线程发送消息
} class MyThread extends Thread{ @Override
public void run() {
Looper.prepare();//获取一个Looper对象
System.out.println("===========");
hand = new Handler(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
System.out.println("MyThread.run()接收到了消息"+",所在线程:"+Thread.currentThread().getName());
}
};
Looper.loop();
} }
}

===============分割线===============

20151008重新总结,具体的说明在注释里有详细的解释,

 <?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:id="@+id/btn_send"
android:onClick="doClick"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="发送" />
<Button
android:id="@+id/btn_Cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="取消发送" /> </LinearLayout>

MainActivity.java

 package com.wyl.handler;

 import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity{
Button btn_fs;//发送
Button btn_qx;//取消
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn_fs = (Button) findViewById(R.id.btn_send);
btn_qx = (Button) findViewById(R.id.btn_Cancel);
btn_fs.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Message msg = handler.obtainMessage();
String str = "我是wyl";
msg.obj = str;
System.out.println("onClick()发送:"+str+","+Thread.currentThread().getName());
handler.sendMessage(msg);
}
});
/*
* 这个线程里的handler在onClick()方法之前使用到,所以需要在线程的run()方法里
* 实例化,onClick()方法里就不用实例化了,也不能怪进行重新实例化,否则又是实例化的
* handler对象就不是一个了,handler不一致的话就会导致循环的队列不是同一个,就会
* 导致workThread里的handleMessage()方法没法接收到UIThread发出的消息
*/
MyThread t = new MyThread();
t.start(); } class MyThread extends Thread{
@Override
public void run() {
Looper.prepare();//步骤1,线程里使用handler必须这样写,
handler = new Handler(){//步骤2,先实例化handler
@Override
public void handleMessage(Message msg) {
String receiver = msg.obj.toString();
System.out.println("receiver:"+receiver+","+Thread.currentThread().getName());
}
};
Looper.loop();//步骤3 ,循环Looper
}
} }

Handler没法取出消息队列中的数据的一个原因的更多相关文章

  1. Android开发 ---多线程操作:Handler对象,消息队列,异步任务下载

    效果图: 1.activity_main.xml 描述:定义了六个按钮 <?xml version="1.0" encoding="utf-8"?> ...

  2. Canal Server发送binlog消息到Kafka消息队列中

    Canal Server发送binlog消息到Kafka消息队列中 一.背景 二.需要修改的地方 1.canal.properties 配置文件修改 1.修改canal.serverMode的值 2. ...

  3. Java从入门到精通——技巧篇之利用dom4j取出XML文件中的数据

    在我们做项目的时候会经常用到XML文件用来配置系统,XML让系统更加的具有了灵活性,Java如何从XML中取出我们想要的数据呢?下面是我利用DOM4J来实现取出XML文件中的数据. XML文件 < ...

  4. 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load

    package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...

  5. 消息队列中点对点与发布订阅区别(good)

    背景知识 JMS一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914).2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1 ...

  6. 删除rabbitmq的队列和队列中的数据

      访问http://{rabbitmq安装IP}:15672,帐号guest,密码guest(也可以使用自己创建的帐号). 登录后访问http://{rabbitmq安装IP}:15672/#/qu ...

  7. 为什么要用消息队列 及 自己如何设计一个mq架构

    1. 解耦:如左图, 系统a因为业务需求需要调用系统b,后续因为业务需求可能需要改代码调用系统c,甚至还要考虑被调用的系统挂了访问超时的问题.耦合性太高! 如右图, 系统a产生一条数据发送到消息队列里 ...

  8. 向mysql数据表中插入数据失败的原因

    1.案例代码: $sql1="insert into content(category,subject,content,username,release_date) values('{$ca ...

  9. activemq读取剩余消息队列中消息的数量

    先上原文链接: http://blog.csdn.net/bodybo/article/details/5647968  ActiveMQ在C#中的应用 ActiveMQ是个好东东,不必多说.Acti ...

随机推荐

  1. HDU2602-Bone Collector

    描述: Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man l ...

  2. 命令 修改WAMP中mysql默认空密码

    WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空, WAMP安装 ...

  3. [LeetCode]题解(python):129-Sum Root to Leaf Numbers

    题目来源: https://leetcode.com/problems/sum-root-to-leaf-numbers/ 题意分析: 一棵树,从跟节点到叶子节点比如1->2那么这个叶子代表12 ...

  4. MVC-04 视图(1)

    不可否认的,View应该是整个ASP.NET MVC项目开发过程中最花时间的部分,因为与显示逻辑相关的技术五花八门,你可能要学习的有HTML.CSS.JavaScript.DOM.JQuery.JSO ...

  5. javascript学习笔记(window .alert 是什么)

    <script language="javascript"> var abc="25"; window .alert(abc); </scri ...

  6. 转:js不同类型对象的比较规则

    Type(x) Type(y) Result type(x)==type(y) x===y otherwise... false null undefined true undefined null ...

  7. 【Android病毒分析报告】 - ZxtdPay 吸费恶魔

    本文章由Jack_Jia编写,转载请注明出处.  文章链接:http://blog.csdn.net/jiazhijun/article/details/11581543 作者:Jack_Jia    ...

  8. Linux-中断和中断处理

    1.中断 #中断使得硬件得以发出通知给处理器,本质上是一种电信号 #中断随时能够产生.内核随时会被打断 #不同设备的中断不同,每一个中断都通过一个唯一的数字标识.称为IRQ(中断请求) 2.中断处理程 ...

  9. bootstrap固定响应式导航

    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap. ...

  10. Canvas使用渐变之-径向渐变详解

    创建径向渐变使用 createRadialGrdient(x0,y0,r0,x1,y1,r1)​ 一共​六个参数,分别代表: 起点的圆心坐标(第一个和第二个参数), 起点园的半径(第三个参数), 终点 ...