主线程发送消息到工作线程,工作线程的步骤是固定为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. Media Queries for Standard Devices

    /* Smartphones (portrait and landscape) ----------- */ @media only screen and (min-device-width : 32 ...

  2. C#代码模拟http发送get和post请求

    private string HttpPost(string Url, string postDataStr) { HttpWebRequest request = (HttpWebRequest)W ...

  3. [LeetCode]题解(python):123-Best Time to Buy and Sell Stock III

    题目来源: https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/ 题意分析: 和上题类似,array[i]代表第i天物品 ...

  4. [LeetCode]题解(python):109-Convert Sorted List to Binary Search Tree

    题目来源: https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题意分析: 给定一个排好序的链表,将这个链 ...

  5. excel读入数据库

    POI3.9效率大幅度提高,支持xls以及xlsx. 首先需要POI的JAR包,MAVEN配置如下: <!-- excel start --> <dependency> < ...

  6. 如何将windows版的vim界面语言(默认为中文)设置成英文

    用安装包安装windows版本的vim(下载地址:http://www.vim.org/download.php),vim会自动根据windows的语言设置vim的界面语言.如何将其改为英文呢? 在v ...

  7. 解读ECMAScript 6箭头函数

    箭头函数是ECMAScript 6最受关注的更新内容之一.它引入了一种用「箭头」(=>)来定义函数的新语法,它…它碉堡了~.箭头函数与传统的JavaScript函数主要区别在于以下几点: 对 t ...

  8. haproxy 超时机制

    <pre name="code" class="python">option redispatch option redispatch 是否允许重新 ...

  9. Kapit控件方法笔记

    r.kapit.visualizer.renderers.DefaultItemRenderer //整个节点添加click处理函数对象类型 fr.kapit.visualizer.controls. ...

  10. Linux虚拟机与外面系统ping不通,或者连不上网

    很多其它具体文档:http://download.csdn.net/download/zml_2015/8843061 非常多人在做linux课程设计的时候,用的linux虚拟机与外面的系统ping不 ...