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 ...
随机推荐
- Ubuntu开启或重启ssh服务
开启ssh服务首先需要安装打开ssh服务的库: sudo apt-get install openssh-server 检查当前的ssh开启情况: ps -e |grep ssh 如果有sshd,则s ...
- 利用filter替换字符串中的空格
s = "abc def ghi xy" print(','.join(filter(lambda x: x, s.split(' '))))
- 【vue】钩子函数生命周期
图1 图2: 图3 相关资料:http://www.zhimengzhe.com/Javascriptjiaocheng/236707.html https://segmentfault.com ...
- 吴恩达课后作业学习1-week3-homework-one-hidden-layer
参考:https://blog.csdn.net/u013733326/article/details/79702148 希望大家直接到上面的网址去查看代码,下面是本人的笔记 建立一个带有隐藏层的神经 ...
- js截取url参数
举例说明,比如http://localhost:2019/blog/getCommentListInfo?postId=1如何获取postId=1这个参数值呢?很简单通过下面代码即可获取,如: win ...
- Debian 8.9 搭建wordpress个人博客
想自己搭个博客玩玩,就搭建了此博客,过程可谓艰辛啊! 先在阿里云买了个 轻量应用服务器 1个月10块钱,好贵.... 用 windows sever 下载不了phpstudy,也不知道怎么回事... ...
- copyOfRange的应用
package com.Summer_0420.cn; import java.util.Arrays; /** * @author Summer * copyOfRange的应用 */ public ...
- <网络编程>套接字介绍
1.端口:IANA(Internet Assigned Numbers Authority)维护着一个端口号分配状况的清单. 众所周知的端口(0-1023):由IANA分配和控制,可能的话,相同的端口 ...
- Vue-组件使用细节
一.用is指定组件为特定的原生HTML元素. html: <div id="app"> <table> <tbody> <item> ...
- router-link 绑定事件的方式
实现方法如下 使用.native 实现原生事件 <router-link to="" @click.native="dialogWithdraw=true&quo ...