Handler没法取出消息队列中的数据的一个原因
主线程发送消息到工作线程,工作线程的步骤是固定为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没法取出消息队列中的数据的一个原因的更多相关文章
- Android开发 ---多线程操作:Handler对象,消息队列,异步任务下载
效果图: 1.activity_main.xml 描述:定义了六个按钮 <?xml version="1.0" encoding="utf-8"?> ...
- Canal Server发送binlog消息到Kafka消息队列中
Canal Server发送binlog消息到Kafka消息队列中 一.背景 二.需要修改的地方 1.canal.properties 配置文件修改 1.修改canal.serverMode的值 2. ...
- Java从入门到精通——技巧篇之利用dom4j取出XML文件中的数据
在我们做项目的时候会经常用到XML文件用来配置系统,XML让系统更加的具有了灵活性,Java如何从XML中取出我们想要的数据呢?下面是我利用DOM4J来实现取出XML文件中的数据. XML文件 < ...
- 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load
package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...
- 消息队列中点对点与发布订阅区别(good)
背景知识 JMS一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914).2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1 ...
- 删除rabbitmq的队列和队列中的数据
访问http://{rabbitmq安装IP}:15672,帐号guest,密码guest(也可以使用自己创建的帐号). 登录后访问http://{rabbitmq安装IP}:15672/#/qu ...
- 为什么要用消息队列 及 自己如何设计一个mq架构
1. 解耦:如左图, 系统a因为业务需求需要调用系统b,后续因为业务需求可能需要改代码调用系统c,甚至还要考虑被调用的系统挂了访问超时的问题.耦合性太高! 如右图, 系统a产生一条数据发送到消息队列里 ...
- 向mysql数据表中插入数据失败的原因
1.案例代码: $sql1="insert into content(category,subject,content,username,release_date) values('{$ca ...
- activemq读取剩余消息队列中消息的数量
先上原文链接: http://blog.csdn.net/bodybo/article/details/5647968 ActiveMQ在C#中的应用 ActiveMQ是个好东东,不必多说.Acti ...
随机推荐
- QTP 9.2 下载&破解
版本不同 但是破解总是这个 crack文件下载 http://ishare.iask.sina.com.cn/f/13802744.html QTP9.2 下载地址 http://www.duot ...
- 操作 IoT 设备内嵌 SQLite
Win10 IoT C#开发 5 - 操作 IoT 设备内嵌 SQLite 数据库 CURD Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本 ...
- Delphi中的内存对齐 与 Packed关键字
以delphi为例:TTest = recordc1: char;i1: Integer;c2: char;c3: Char;end;这个结构如果用sizeof取其占用的内存大小,是多少呢,是1+4+ ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决方案
在Myeclipse中运行小应用程序时出现如下异常的解决办法 java.lang.UnsupportedClassVersionError: Bad version number in .class ...
- 01_什么是Elasticsearch
Logstash是一个开源的用于收集,分析和存储日志的工具. Kibana4用来搜索和查看Logstash已索引的日志的web接口.这两个工具都基于 Elasticsearch. Logstash: ...
- Strata 2014 上的 AzureCAT 粉笔会谈
本周,AzureCAT 团队非常高兴在 Strata 会议上首次集体亮相.对于那些对 AzureCAT 团队不太熟悉的人来说,我们是 Microsoft 云与企业部门一个核心的国际性团队,由大约 ...
- python3 ImageTk 安装方法
使用命令: $ sudo yum search PIL | grep python3 可显示得知: python3-dogpile-cache.noarch : A caching front-end ...
- Color the ball(树状数组+线段树+二分)
Color the ball Time Limit : 9000/3000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Tota ...
- js 获取星期
var week; if (new Date().getDay() == 0) week = "星期日"; if (new Date() ...