Handler主线程子线程之间的互相通信
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主线程子线程之间的互相通信的更多相关文章
- Android 主线程和线程之间相互发送消息
通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带L ...
- Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作
前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行. 比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void load ...
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...
- (转)C#/.NET主线程与子线程之间的关系
一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少一个主线程”,这一说法持有怀疑 主线程与子线程之间的关系 ...
- C#/.NET主线程与子线程之间的关系
以前一直没有在程序中写过总结,再翻开程序时却不知所云,所以我决定写总结 一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少 ...
- 父窗口,子窗口之间的JS"通信"方法
今天需要在iframe内做一个弹窗,但使用弹窗组件的为子窗口,所以弹窗只在子窗口中显示掩膜层和定位,这样不符合需求. 后来晓勇哥指点,了解到一个以前一直没关注到的东西,每个窗口的全局变量,其实都存在对 ...
- Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解
MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...
- Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息
MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...
- android 主线程和子线程之间的消息传递
从主线程发送消息到子线程(准确地说应该是非UI线程) package com.zhuozhuo; import android.app.Activity; import android.os.Bun ...
随机推荐
- UVA12113-Overlapping Squares(二进制枚举)
Problem UVA12113-Overlapping Squares Accept:116 Submit:596 Time Limit: 3000 mSec Problem Descripti ...
- 关于 chrome canary X64 在 win7 64bit 下面缺少openvr_api.dll的解决方法
在github上下载openvr_api.dll放到chrome的安装目录下就可以. 其实放到系统目录下最好,以后其他程序要使用的时候也能使用的到. https://github.com/ValveS ...
- [python] os.path.join() 与 sys.path
脚本文件本地目录挂入系统环境变量 import sys, os sys.path.append(os.pardir) print(sys.path) os.getcwd()获取当前目录路径 impor ...
- [找工作] 2019秋招|从春招到秋招,Java岗经验总结(收获AT)
转自(有更多) https://blog.csdn.net/zj15527620802/article/month/2018/10 前言 找工作是一件辛酸而又难忘的历程.经历过焦虑.等待.希望,我们最 ...
- 【转】APK反编译
学习和开发Android应用有一段时间了,今天写一篇博客总结一下Android的apk文件反编译.我们知道,Android应用开发完成之后,我们最终都会将应用打包成一个apk文件,然后让用户通过手机或 ...
- Python:Day21
序列化 我们把对象(变量)从内存中变成可存储或可传输的过程称之为序列化 json模块
- Python:Day04
数学运算符: + 加 - 减 * 乘 ** 指数运算 / 除 // 整除 % 取余 比较运算符: > 大于 < 小于 >= 大于等于 <= 小于等于 == ...
- 联想Y7000安装显卡驱动
之前看了很多教程,一直在登陆界面循环重启!!! 多半是opengl问题!! https://blog.csdn.net/weixin_42577219/article/details/84313220 ...
- MemCache在.NET中使用Memcached.ClientLibrary详解 转发 https://www.cnblogs.com/li150dan/p/9529112.html
本文说明:memcached分布式缓存的负载均衡配置比例,数据压缩,socket的详细配置等,以及在.net中的常用方法 首先下载客户端的3个dll,ICSharpCode.SharpZipLib.d ...
- docker 7 docker的帮助命令
docker的帮助命令 [root@t-docker chenzx]# docker info [root@t-docker chenzx]# docker version [root@t-docke ...