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 ...
随机推荐
- 原生js实现的轮播图,易用+可多用
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Android 开发笔记 “弹出框”
AlertDialog.Builder builder = new AlertDialog.Builder(Activity.this); builder.setMessage("Are y ...
- HTML+CSS笔记 CSS入门续集
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...
- 如何将windows版的vim界面语言(默认为中文)设置成英文
用安装包安装windows版本的vim(下载地址:http://www.vim.org/download.php),vim会自动根据windows的语言设置vim的界面语言.如何将其改为英文呢? 在v ...
- Qt官方开发环境生成的exe发布方式--使用windeployqt(windeployqt是单独的程序,放在低版本qt4目录下也可以运行的)
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...
- spring与redis集成之aop整合方案
java使用redis缓存可以使用jedis框架,jedis操作简单,没有什么复杂的东西需要学习,网上资料很多,随便看看就会了. 将spring与redis缓存集成,其实也是使用jedis框架,只不过 ...
- 求最大值最小值的方法 时间复杂度O(n)
#include<iostream> #include <iostream> #include <bitset> #include <ctime> us ...
- JavaEE Tutorials (11) - 使用Criteria API创建查询
11.1Criteria和Metamodel API概述16811.2使用Metamodel API为实体类建模170 11.2.1使用元模型类17011.3使用Criteria API和Metamo ...
- hdoj 1233 还是畅通工程(最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路分析:该问题为最小生成树问题,使用kruskal算法或者prim算法即可解决: 代码如下: ...
- 网页压缩gzip的问题及说明教程
关于网页压缩gzip的问题及说明教程 最近比较多人反应gzip的问题 在wdcp的后台里已经有gzip功能的选项,也就是说,只要在这里开启了,就已支持 但从最近的问题中发现,基本上都是使用一些在线检测 ...