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 ...
随机推荐
- opencv学习——兴趣区选取
在OpenCV中,普遍支持ROI和widthStep,函数的操作被限制于感兴趣的区域,要设置或者取消ROI,就要使用cvSetImageROI()和cvResetImage()函数.如过想设置ROI, ...
- J2SE宏观总结
- CreateThread和_BeginThread的区别
1.程序: 程序构成: (1)源代码 (2)可执行的二进制代码 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念.由操作系统加载其可执行的二进制代码,分配相应的数据结构:进程控制 ...
- css自定义字体完美解决方案example
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- gulp.spritesmith修改px为rem单位
移动端开发中,使用gulp.spritesmith进行小图sprite并生成样式,但由于spritesmith默认是以px为单位,所以就把插件的内容修改了下让生成rem单位并且能把background ...
- svn不能提交 svn: is out of date; try updating
今天做项目合并的时候突然不能提交了,开始以为是和服务器的有修改冲突,然后更新一下发现还是不能提交,每次都报is out of date;还原文件 -> 修改 -> 提交 -> 仍然报 ...
- Eclipse 中打不开android sdk managerf
今天配置android sdk 的时候,出现了android sdk 打不开的情况.无论直接点击 sdk manager.exe 还是从eclipse启动,都不起作用,双重启(重启eclipse和ad ...
- WordPress 主题开发 - (四) 创建WordPress的主题HTML结构 待翻译
Now we're starting to get into the real meat of WordPress Theme development: coding the HTML structu ...
- js控制div动起来
代码: <html> <head> <title>让div动的测试</title> <script language="javascri ...
- WCF 内存入口检查失败
WCF 内存入口检查失败 Memory gates checking failed 异常信息:内存入口检查失败,因为可用内存(xxx 字节)少于总内存的 xx%.因此,该服务不可用于传入的请求.若 ...