19 Handler 子线程向主线程发送信息
- 案例一 Message创建三种方法:
package com.example.day19_handler_demo1;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv;
private int count =0;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
Log.e("AAA", "=handleMessage=>"+Thread.currentThread().getName());
//处理消息
//获取消息
int num = msg.arg1;
//更新数据
tv.setText(num+"");
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
// android.view.ViewRootImpl$CalledFromWrongThreadException:
// Only the original thread that created a view hierarchy
// can touch its views.
new Thread(){
public void run() {
while(true){
if(count<100){
count++;
}
Log.e("AAA", "=Thread=>"+Thread.currentThread().getName());
// tv.setText(count+"");
//方式一获取Message对象 不建议使用
//Message msg = new Message(); 如果用sendToTarget想要setTarget
//方式二获取Message对象
//Message msg = Message.obtain(); 方便后面用sendToTarget
//方式三获取Message对象
Message msg = handler.obtainMessage();
//msg携带数据
msg.arg1 = count;
//使用Handler发送数据
handler.sendMessage(msg);
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}.start();
}
}
- 案例二 Message几个信息载体:
package com.qf.day19_handler_demo2;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
//接收和处理消息的
switch (msg.what) {//根据标记进行处理数据
case 1:
int a = msg.arg1;
int a2 = msg.arg2;
String str = (String) msg.obj;
int flag = msg.what;
Log.e("AAA", "==a=="+a);
Log.e("AAA", "==a2=="+a2);
Log.e("AAA", "==str=="+str);
Log.e("AAA", "==flag=="+flag);
break;
case 2:
Log.e("AAAA", "AAAAAAAAAAAAAAAA");
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//子线程里的数据发送到主线程
public void OnMyClick(View v){
new Thread(){
public void run() {
//获取消息的载体对象
Message msg = Message.obtain();
msg.arg1 = 100;
msg.arg2 = 200;//arg1,arg2:都是int类型数据
msg.obj = "我是大数据"; //Object对象 string Bitmap List<T>
msg.what = 1;//int 类型 标记
handler.sendMessage(msg);
};
}.start();
}
}
- 案例三 几个发送msg的方式:
package com.qf.day19_handler_demo4;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView ivShow;
Handler handler = new Handler();
Handler handler2 = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
pDialog.show();
break;
case 2:
Bitmap bitmap = (Bitmap) msg.obj;
ivShow.setImageBitmap(bitmap);
pDialog.dismiss();
break;
default:
break;
}
};
};
private ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivShow = (ImageView) findViewById(R.id.iv_show);
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setTitle("下载图片");
pDialog.setIcon(R.drawable.ic_launcher);
pDialog.setMessage("正在下载中,请稍后...");
}
public void MyLoadClick(View v) {
//pDialog.show();
//开启子线程下载图片
new Thread(){
public void run() {
//在子线程展示
//发送null消息 只设置一个标记
handler2.sendEmptyMessage(1);
byte[] data = HttpUtil.getHttpResult("https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=2507878052,3446525205&fm=58");
final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
//第一种方式 将代码块发送到主线程 在内部直接一个匿名内部类runnable 可以直接更新UI(主线程)
// handler.post(new Runnable() {
//
// @Override
// public void run() {
// // TODO Auto-generated method stub
// Log.e("AAA", "=handler=>"+Thread.currentThread().getName());
//
// //更新Ui
// ivShow.setImageBitmap(bitmap);
// pDialog.dismiss();
// }
// });
//延迟发送 在内部直接一个匿名内部类runnable 可以直接更新UI(主线程)
// handler.postDelayed(r, delayMillis)
//第二种方式 使用msg 携带数据到主线程
// Message msg = Message.obtain();
// msg.obj = bitmap;
// msg.what = 2;
// handler2.sendMessage(msg);
// 延迟发送一个msg
//handler2.sendMessageDelayed(msg, delayMillis)
//第三种 sendToTarget 发送到那个Handler
// Message msg = handler2.obtainMessage();
// msg.obj = bitmap;
// msg.what = 2;
// msg.sendToTarget();//发送给那个Handler
//第四种方式
Message msg = Message.obtain();
msg.obj = bitmap;
msg.what = 2;
msg.setTarget(handler2);//指明是那个Handler
msg.sendToTarget();//发送给那个Handler
};
}.start();
}
}
19 Handler 子线程向主线程发送信息的更多相关文章
- Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息
先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest; import android.app.Activity; import and ...
- c# 子线程与主线程通信二
之前写过使用线程上下文实现线程同步,今天利用子线程向主线程发送事件,实现子线程与主线程的同步 基本步骤 1.定义类 using System; using System.Collections.Gen ...
- [转]QT子线程与主线程的信号槽通信-亲测可用!
近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...
- Qt自己定义事件实现及子线程向主线程传送事件消息
近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...
- WinForm 中使用 Action 子线程对主线程 控制进行访问
/// <summary> /// 开启新线程执行 /// </summary> /// <param name="sender"></p ...
- C# 子线程与主线程通讯方法一
最近在项目中要用到子线程运行结束向主线程通知的需求,利用线程上下文来实现线程之间的同步. 子线程结束后调用同步函数,向主线程发送时间字符串,改变主窗体的label标签 label标签改变事件触发处理函 ...
- Android中,子线程使用主线程中的组件出现问题的解决方法
Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行 ...
- C# 子线程调用主线程窗体的解决方法
摘自其他人博客,自己试过确实解决问题.(如在自己定义的线程里面给textbox赋值) 由于Windows窗体控件本质上不是线程安全的.因此如果有两个或多个线程适度操作某一控件的状态(set value ...
- Unity3d 创建线程 子线程与主线程通信
创建子线程 一,不带参数 Thread resourcesLoadThread=new Thread (this.resourceLoadTxt); resourcesLoadThread.Sta ...
随机推荐
- [FJOI 2014]最短路径树问题
Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最 ...
- [BZOJ 2144]跳跳棋
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- [POI 2015]Kinoman
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- [HNOI2015]落忆枫音
题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再 ...
- [Sdoi2016]征途
Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...
- 网络基础-再议TCP
以前只是知道3次握手和4次挥手,但是对于其在连接和断开时的各个状态却不是很懂,今天就来看一下握手和挥手时的状态转换图: 1.三次握手和四次挥手时的状态转换图: 实线表示应用程序: 应用层首先发SYN的 ...
- hdu 5491(位运算)
题意:给你n,a,b. 希望得到比n大,二进制1的个数在 a ,b之间的最小的数 思路:①满足条件,输出 ②num < a 从右找到是0的最小位,变成1 ③num > b从右到左找是1的最 ...
- 【vijos1943】上学路上
题目戳这里 描述 小雪与小可可吵架了,他们决定以后互相再也不理对方了.尤其是,他们希望以后上学的路上不会再相遇. 我们将他们所在城市的道路网视作无限大的正交网格图,每一个整数点 (x,y) 对应了一个 ...
- Windows下使用notepad++对文本进行行列转换
行转列: Ctrl + F 选择替换 查找目标:填写指定的内容 替换为:\r\n 查找模式:正则表达式 单击替换或全部替换按钮 列转行: Ctrl + F 选择替换 查找目标:\r\n 替换为:不 ...
- 使用jquery.qrcode.js生成二维码
通常生成二维码的方式有两种:第一种是java代码的形式,第二种是通过Js方式. 在这里我做个记录,用js生成二维码,可以在官网下载源码:http://jeromeetienne.github.io/j ...