Android线程---UI线程和非UI线程之间通信
public class UpdataPeople extends Activity { EditText updata_name;
EditText updata_phone;
EditText updata_address;
Button updata_quxiao;
Button updata_baocun; String name;
String phone; //创建一个子线程对象
UpdataThread updataThread ; //定义一个全局变量,该Handler在主线程中重写HandleMessage。
//若不定义成为全局变量,则在子线程中无发用到该Handler
private Handler mainHandler = null; //创建一个非UI线程
class UpdataThread extends Thread { public Handler mhandler; public void run() {
Looper.prepare();
mhandler = new Handler() { //定义处理消息的方法
@Override
public void handleMessage(Message msg) {
//---这里面做一些耗时操作
if (msg.what == 0x123) {
//获取msg所携带的数据
Bundle bundle = msg.getData();
if (bundle != null) {
String name = bundle.getString("name");
String phone = bundle.getString("phone");
Toast.makeText(getApplication(), "传值成功" + name + phone, Toast.LENGTH_LONG).show();
} else {
name = " ";
phone = " ";
}
//创建并连接数据库,若该数据库已经存在,则打开该数据库
CreateDatabaseHelper cdh = new CreateDatabaseHelper(getApplication(), "myPeople.db3", 1);
//使用游标查询数据库,并返回结果集
Cursor cursor = cdh.getReadableDatabase().rawQuery("select * from people where name = ? and phone = ?", new String[]{name, phone});
//创建一个Bundle存储查询出来的结果
Bundle dataAll = new Bundle();
//遍历cursor,并将结果赋值给Bundle
while (cursor.moveToNext()) {
dataAll.putString("name", cursor.getString(1));
dataAll.putString("phone", cursor.getString(2));
dataAll.putString("address", cursor.getString(3));
}
//↓↓↓↓↓↓↓这一块便是子线程将查询的结果返回给主线程↓↓↓↓↓↓↓
//创建Message
Message msg_main = new Message();
msg_main.what = 0x456;
//为Message添加数据
msg_main.setData(dataAll);
//向主线程发送消息
mainHandler.sendMessage(msg_main); }
}
};
Looper.loop();
}
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//实例化Thread
updataThread = new UpdataThread();
//启动新线程
updataThread.start();
setContentView(R.layout.updatapeople);
//获取布局文件里的控件
updata_name = (EditText) findViewById(R.id.updata_name);
updata_phone = (EditText) findViewById(R.id.updata_phone);
updata_address = (EditText) findViewById(R.id.updata_address);
updata_quxiao = (Button) findViewById(R.id.updata_quxiao);
updata_baocun = (Button) findViewById(R.id.updata_baocun); //获取启动该Activity的Intent
Intent intent = getIntent();
//取出Intent所携带的数据包
Bundle datas = intent.getExtras();
//取出包中所携带的各种数据
if (datas != null) {
name = datas.getString("name");
phone = datas.getString("phone");
} else {
name = "空";
phone = "空";
}
//↓↓↓↓↓↓↓这一块便是主线程向子线程发送消息↓↓↓↓↓↓↓↓
//创建消息
Message msg = new Message();
//为msg标记一下(类似与--key--)
msg.what = 0x123;
//创建一个Bundle,并存放数据
Bundle bundle = new Bundle();
bundle.putString("name", name);
bundle.putString("phone", phone);
//将数据添加到msg
msg.setData(bundle);
//向新线程发送消息
updataThread.mhandler.sendMessage(msg); //接受子线程返回的消息和子线程那边的用法一样
mainHandler = new Handler() {
@Override
public void handleMessage(Message msg_main) {
if (msg_main.what == 0x456){
//更新UI(因为在UI 线程中可以进行UI的更新。。。)
updata_name.setText(msg_main.getData().getString("name"));
}
}
};
Android线程---UI线程和非UI线程之间通信的更多相关文章
- Android关于主线程和非主线程
必须在主线程执行的任务: (1)UI更新 必须在非主线程中执行的任务 (1)Http请求 如执行:ImageHelper.getInstance().loadImageSync(picUrl); 外面 ...
- vue非父子关系之间通信传值
第一种方法: 通过给vue实例添加自定义属性 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...
- Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面
目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...
- Java中的守护线程 & 非守护线程(简介)
Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...
- day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁
一.线程 1.进程:资源的分配单位 线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...
- Android UI线程和非UI线程
Android UI线程和非UI线程 UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这 ...
- Android 高级UI设计笔记17:Android在非UI线程中显示Toast
1. 子线程的Toast怎么显示不出来? 因为Toast在创建的时候会依赖于一个Handler,并且一个Handler是需要有一个Looper才能够创建,而普通的线程是不会自动去创建一个Looper对 ...
- android脚步---如何看log之程序停止运行,和UI线程和非UI线程之间切换
经常运行eclipse时,烧到手机出现,“停止运行”,这时候得通过logcat查log了.一般这种情况属于FATAL EXCEPTION,所以检索FATAL 或者 EXCEPTION,然后往下看几行 ...
- android 在非UI线程更新UI仍然成功原因深入剖析
”只能在UI主线程中更新View“. 这句话很熟悉吧? 来来,哥们,看一下下面的例子 @Override protected void onCreate(Bundle savedInsta ...
随机推荐
- Flex4 DataGrid实现可复制单元格,同时解决自定义GridItemRenderer出现1009错误的方法
原创内容,如需转载,请注明出处,谢谢 最近在项目中发现Flex的DataGrid不支持内容复制,在涉及到保护敏感数据时倒是很有用处,但大部分情况下,我们还是希望客户能够直接复制DataGrid单元格中 ...
- ios 获取通讯录的所有信息
iOS获取通讯录全部信息 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBoo ...
- 第4章 sed命令
1 sed命令基本用法 sed(stream editor)是流编辑器,可对文本文件和标准输入进行编辑: sed只是对缓冲区中原始文件的副本进行编辑,并不编辑原始的文件,如果需要保存改动内容,可以选择 ...
- 学习总结 html一般标签的使用
body的属性: bgcolor 页面背景色 background 背景壁纸.图片 text 文字颜色 topmargin 上边距 leftmargin 左边距 rightmargin 右边 ...
- 如何使用编辑模板在ASPxGridView中进行新增修改(除去常规的gridviw模板编辑外)
aspgridview模板编辑效果图: //前端代码:(核心: <Templates><EditForm>.....中间可用栅格样式布局等(随意)...</Templat ...
- 用verilog模拟DDS产生正弦波信号
前言: DDS:直接数字频率合成,正弦波0-2pi周期内,相位到幅度是一一对应的(这里我们使用放大后的整数幅度). 主要思路: 个人理解,FPGA不擅长直接做数字信号计算,那样太占用片上逻辑资源,所以 ...
- hdu2444
#include <stdio.h> #include <string.h> #define black 1 #define white -1 ]; ]; ][]; int n ...
- JavaScript中的Get和Set访问器
今天要和大家分享的是JavaScript中的Get和Set访问器,和C#中的访问器非常相似. 标准的Get和Set访问器的实现 function Field(val){ this.va ...
- javaSE第五天
第五天 22 1. 方法(掌握) 22 (1)方法:就是完成特定功能的代码块. 22 (2)格式: 22 (3)两个明确: 23 (4)方法调用 23 (5)案例: ...
- ipv4、ipv6的socket同时监听“bind: Address already in use”的解决方法
创建ipv4和ipv6的socket,同时监听某个端口的ipv4和ipv6报文,运行时bind函数执行失败,提示“bind: Address already in use”.原因:ipv6的socke ...