Handler主线程子线程之间的互相通信

 package com.wyl.dansnote;

 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;
import android.widget.Toast; public class SecActivity extends Activity implements OnClickListener{
Button btn_main_to_work;
Button btn_work_to_main;
Handler handler;
Handler handler_main_to_work;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sec_main);
initViews();
initMainHandler();//子线程向主线程发送消息
new MainToWorkThread().start();//主线程向子线程发送消息
initClicks();
} private void initMainHandler() {
handler = new MainHandler();
}
class MainHandler extends Handler{
@Override
public void handleMessage(Message msg) {
String msg_rtn = (String)msg.obj;
// System.out.print("MainHandler.handleMessage():"+msg_rtn+",当前线程:"+Thread.currentThread().getName());
Toast.makeText(SecActivity.this, "MainHandler.handleMessage():"+msg_rtn+",当前线程:"+Thread.currentThread().getName(), 100).show();
}
}
//子线程向主线程发送消息
class WorktoMainThread extends Thread{
@Override
public void run() {
Message msg = handler.obtainMessage();
msg.obj = "我是模拟的网络数据";
handler.sendMessage(msg);
System.out.println("开始发送网络数据:");
//暂时还不清楚为什么这个线程里使用Toast的时候一定要加上Looper.prepare(),否则就报错
// Looper.prepare();
// Toast.makeText(SecActivity.this, Thread.currentThread().getName()+"开始发送网络数据:", 100).show();
}
} class MainToWorkThread extends Thread{
@Override
public void run() {
Looper.prepare();
handler_main_to_work = new Handler(){
@Override
public void handleMessage(Message msg) {
String msg_get = (String)msg.obj;
// handler_main_to_work.sendMessage(msg);
Toast.makeText(SecActivity.this, Thread.currentThread().getName()+",MaintoWorkHandler.handleMessage()开始接收消息:"+msg_get, 100).show();
}
};
Message msg = handler_main_to_work.obtainMessage();
String msg_get = (String) msg.obj;
System.out.println("MainToWorkThread获取到的消息:"+msg_get);
Looper.loop();
}
} private void initClicks() {
btn_main_to_work.setOnClickListener(this);
btn_work_to_main.setOnClickListener(this);
} private void initViews() {
btn_main_to_work = (Button) findViewById(R.id.id_btn_w_to_main);
btn_work_to_main = (Button) findViewById(R.id.id_btn_main_to_w);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.id_btn_w_to_main:
new WorktoMainThread().start();
break;
case R.id.id_btn_main_to_w:
Message msg = handler_main_to_work.obtainMessage();
msg.obj = "我是点击的时候发送给子线程的消息";
handler_main_to_work.sendMessage(msg);
break;
default:
break;
}
}
}

  

Handler主线程子线程之间的互相通信的更多相关文章

  1. Android 主线程和线程之间相互发送消息

    通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带L ...

  2. Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作

    前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行. 比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void load ...

  3. Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

    keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...

  4. (转)C#/.NET主线程与子线程之间的关系

    一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程.       有的博客上说“至少一个主线程”,这一说法持有怀疑         主线程与子线程之间的关系        ...

  5. C#/.NET主线程与子线程之间的关系

    以前一直没有在程序中写过总结,再翻开程序时却不知所云,所以我决定写总结        一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程.       有的博客上说“至少 ...

  6. 父窗口,子窗口之间的JS"通信"方法

    今天需要在iframe内做一个弹窗,但使用弹窗组件的为子窗口,所以弹窗只在子窗口中显示掩膜层和定位,这样不符合需求. 后来晓勇哥指点,了解到一个以前一直没关注到的东西,每个窗口的全局变量,其实都存在对 ...

  7. Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解

    MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...

  8. Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息

    MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...

  9. android 主线程和子线程之间的消息传递

    从主线程发送消息到子线程(准确地说应该是非UI线程)  package com.zhuozhuo; import android.app.Activity; import android.os.Bun ...

随机推荐

  1. 彻底理解js中的&&和||

    阅读代码时对一行代码很困惑 step > max_step && (step = min_step); 查阅资料后发现它等价于 if (step > max_step) { ...

  2. RocketMQ实现事务消息

    在RocketMQ4.3.0版本后,开放了事务消息这一特性,对于分布式事务而言,最常说的还是二阶段提交协议,那么RocketMQ的事务消息又是怎么一回事呢,这里主要带着以下几个问题来探究一下Rocke ...

  3. UVA437-The Tower of Babylon(动态规划基础)

    Problem UVA437-The Tower of Babylon Accept: 3648  Submit: 12532Time Limit: 3000 mSec Problem Descrip ...

  4. TensorFlow的主要依赖库

    Protool Buffer 处理结构化数据的工具 Name:张飞 id: 123456 email: 10000@qq.com 上面信息 就是一个结构化数据(这里说的结构化数据和大数据的结构化数据概 ...

  5. 转://SQLNET.EXPIRE_TIME参数

    DCD: Dead Connection Detection ,可以用于检测.标记僵死而没有断开会session,再由PMON进行清理,释放资源.开启DCD,只需要在服务端的sqlnet.ora文件中 ...

  6. 爬取伯乐在线文章(四)将爬取结果保存到MySQL

    Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...

  7. 2018-2019-3《Java程序设计》第二周学习总结

    学号20175329 2018-2019-3<Java程序设计>第二周学习总结 教材学习内容总结      第二三章与我们所学习的C语言有很多的相似点,在这里我想主要就以我所学习的效果来讨 ...

  8. jmeter(二十三)分布式测试

    jmeter用了一年多,也断断续续写了一些相关的博客,突然发现没有写过分布式测试的一些东西,这篇博客就介绍下利用jmeter做分布式测试的一些技术点吧,权当参考... 关于jmeter的介绍和元件作用 ...

  9. JPA和分布式事务简介

    1. Transaction 分两种,Local Transaction 和 Global Transaction. 涉及到一个Connection的Commit,称为Local Transactio ...

  10. 扒一扒: Java 中的枚举

    目录 1. 枚举的定义 1.1 传统的非枚举方法 1.2 枚举方法 1.3 定义总结 2 枚举的本质 2.1 继承 java.lang.Enum 2.2 final 类型 2.3 枚举常量本身就是该类 ...