WorkerThread与MainThread之间通过Handler进行最简单的消息传递
一、从自己开启的线程中给主线程发送信息,更新UI
这个实例的效果是,在线程中通过handler发送一条信息给handler,然后通过handler更改UI线程中,textview的文字。
主要方法是(在线程中生成消息对象,并发送消息。这里可以设置what,我图简单就没设置):
class MyThread extends Thread{
@Override
public void run() {
try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = mHandler.obtainMessage();//从handler得到消息对象
msg.obj = "message";//通过这个对象来存放信息
mHandler.sendMessage(msg);//给handler发送消息
}
}
完整代码如下:
MainActivity.java
package com.kale.handler; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView; public class MainActivity extends Activity {
TextView valeTv; private Thread thread;
private Handler mHandler; class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
System.out.println("线程名:"+Thread.currentThread().getName());
valeTv.setText((String) msg.obj);
}
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
valeTv = (TextView) findViewById(R.id.vale_textView);
mHandler = new MyHandler();
thread = new MyThread();
// 启动线程
thread.start();
} class MyThread extends Thread{
@Override
public void run() {
try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = mHandler.obtainMessage();//从handler得到消息对象
msg.obj = "message";//通过这个对象来存放信息
mHandler.sendMessage(msg);//给handler发送消息
}
} }
二、从主线程给自己定义的线程中发送信息
主要步骤就是在在新新线程中的run()中初始化looper,然后建立handler。接着,在主线程中建立一个消息对象,这个消息对象时由新线程中的handler建立的。这样二者就联系起来了
主要代码如下:
// 定义一个自己的线程
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程开始运行");
Looper.prepare();// 在线程中必须建立一个自己的looper,不能用ui线程中的
handler = new Handler() {// 在新线程中创建Handler时必须创建Looper
public void handleMessage(Message msg) {
Toast.makeText(MainActivity.this, (String) msg.obj, 0).show();
};
};
// looper不断的从消息队列中取出消息,如果没有就阻塞
Looper.loop();
}
全部代码:
package com.kale.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.widget.Toast; public class MainActivity extends Activity {
Handler handler; // 定义一个自己的线程
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程开始运行");
Looper.prepare();// 在线程中必须建立一个自己的looper,不能用ui线程中的
handler = new Handler() {// 在新线程中创建Handler时必须创建Looper
public void handleMessage(Message msg) {
Toast.makeText(MainActivity.this, (String) msg.obj, 0).show();
};
};
// looper不断的从消息队列中取出消息,如果没有就阻塞
Looper.loop();
} } private MyThread thread; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
thread = new MyThread();
// 启动线程
thread.start();
} public void buttonListener(View v) {
sentMsg();
} private void sentMsg() {
// 创建消息
Message msg = handler.obtainMessage();
msg.obj = "success!";
handler.sendMessage(msg);
}
}
WorkerThread与MainThread之间通过Handler进行最简单的消息传递的更多相关文章
- 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler
来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...
- Android handler的使用简单示例
Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMes ...
- spring mvc 第二天【注解实现springmvc Handler处理ajax简单请求 的配置】
这里使用的是在前台发起ajax请求Handler,后台伪造数据响应给前台, 配置对应ajax请求的Handler信息如下 @Controller public class MyController { ...
- Spring MVC-处理程序映射(Handler Mapping)-简单的Url处理程序映射(Simple Url Handler Mapping)示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_simpleurlhandlermapping.htm 说明:示例基于Spring ...
- Handler, AsyncTask用法简单示例
package com.jim.testapp; import android.app.Activity; import android.os.AsyncTask; import android.os ...
- Android中的Handler,以及用Handler延迟执行
项目中遇到一个情况,先生成文件再上传:但有时候发出指令后上传会不成功,需要再发一次指令方能上传. 猜想是由于文件还没生成就执行「上传」指令了.想到要延时.Android中单纯用currentThrea ...
- android之handler机制深入解析
一.android中需要另开线程处理耗时.网络的任务,但是有必须要在UI线程中修改组件.这样做是为了: ①只能在UI线程中修改组件,避免了多线程造成组件显示混乱 ②不使用加锁策略是为了提高性能,因为a ...
- Android的Handler机制
Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...
- Android之消息机制Handler,Looper,Message解析
PS:由于感冒原因,本篇写的有点没有主干,大家凑合看吧.. 学习内容: 1.MessageQueue,Looper,MessageQueue的作用. 2.子线程向主线程中发送消息 3.主线程向子线程中 ...
随机推荐
- chrome书签(收藏栏)的导入导出
- Windows下使用 Sublime Text + MinGW 搭建C/C++开发环境
下载并安装 Sublime Text 点击此处从官网下载适合自己的Windows系统的Sublime Text 下载好后双击进行安装(一路next就好啦) 下载 MinGW 点击此处下载MinGW 下 ...
- spring过滤器
什么是过滤器 Spring 中不能处理用户请求,但可以用来提供过滤作用的一种Servlet规范.在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理.具 ...
- jQuery漏掉的东西
prop和attr的区别 attr一般都用来设置和操作元素的自定义属性的,而prop一般都是操作元素的内置属性的(尤其是表单元素的操作我们大部分都在使用prop) each 可以遍历jQuery集合中 ...
- Android-RemoteView-桌面小部件
Android-RemoteView-桌面小部件 学习自 <Android开发艺术探索> https://developer.android.google.cn/guide/topics/ ...
- 【BZOJ 3027】 3027: [Ceoi2004]Sweet (容斥原理+组合计数)
3027: [Ceoi2004]Sweet Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 71 Solved: 34 Description John ...
- csdn 音乐 怎么拦截 提交后的程序 csdn 栏目 音乐 csdn 添加 音乐
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha csdn 栏目 音乐 csdn 添加 音乐 ======= <embed src= ...
- code vs 1094 FBI树 2004年NOIP全国联赛普及组
题目描述 Description 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树[1],它的结点类型 ...
- QtTest模块出现控制台的原因与方案
转到Qt安装目录下的mkspces/features目录下, 1.用记事本打开qtestlib.prf文件,注释掉CONFIG += console #CONFIG += console 2.用记事本 ...
- 将网桥的配置写进去/etc/sysconfig/network-scripts/ifcfg-xxx
有时候需要使用网桥命令比如brctl设置一些网桥的属性,而这些方式能否同样写进去配置文件使其永久开机生效. 答案是不行的,也同样找过Ubuntu的,其实Ubuntu可以实现,参考:http://man ...