近期自学到了线程这一块,用了一上午的时间终于搞出来了主、子线程间的相互通信。当主线程sendMessage后,子线程便会调用handleMessage来获取你所发送的Message。我的主线程向子线程发送消息时携带了数据,子线程根据主线程发送来的数据进行数据库查询,并将查询后的结果返回给该主线程:

  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线程之间通信的更多相关文章

  1. Android关于主线程和非主线程

    必须在主线程执行的任务: (1)UI更新 必须在非主线程中执行的任务 (1)Http请求 如执行:ImageHelper.getInstance().loadImageSync(picUrl); 外面 ...

  2. vue非父子关系之间通信传值

    第一种方法: 通过给vue实例添加自定义属性 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  3. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...

  4. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

    目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...

  5. Java中的守护线程 & 非守护线程(简介)

    Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...

  6. day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁

    一.线程     1.进程:资源的分配单位    线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...

  7. Android UI线程和非UI线程

    Android UI线程和非UI线程 UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这 ...

  8. Android 高级UI设计笔记17:Android在非UI线程中显示Toast

    1. 子线程的Toast怎么显示不出来? 因为Toast在创建的时候会依赖于一个Handler,并且一个Handler是需要有一个Looper才能够创建,而普通的线程是不会自动去创建一个Looper对 ...

  9. android脚步---如何看log之程序停止运行,和UI线程和非UI线程之间切换

    经常运行eclipse时,烧到手机出现,“停止运行”,这时候得通过logcat查log了.一般这种情况属于FATAL EXCEPTION,所以检索FATAL 或者 EXCEPTION,然后往下看几行 ...

  10. android 在非UI线程更新UI仍然成功原因深入剖析

    ”只能在UI主线程中更新View“. 这句话很熟悉吧? 来来,哥们,看一下下面的例子 @Override       protected void onCreate(Bundle savedInsta ...

随机推荐

  1. 【教程】【FLEX】#003 自定义事件、模块间通讯

    本篇笔记,主要阐明 事件是如何创建 和 如何使用自定义事件达到模块之间通讯 的效果. 句子解释: 什么叫做模块之间的通讯呢?? 简单点说,就是两个模块之间可以互相传数据. A模块 可以接收到 B模块的 ...

  2. linux下LAMP环境搭建尝试

    最近,学习搭建了LAMP服务环境,中间遇到了很多问题,经过不断摸索总算得以解决.为了大家少走弯路,现将相关经验进行总结. linux下软件安装分为自动安装和手动安装两种,自动安装借助工具如yum等,自 ...

  3. 酒鬼-DP

    Description Santo刚刚与房东打赌赢得了一间在New Clondike 的大客厅.今天,他来到这个大客厅欣赏他的奖品.房东摆出了一行瓶子在酒吧上.瓶子里都装有不同体积的酒.令Santo高 ...

  4. 火箭18号秀光膀为父母割草(FW)

    火箭18号秀光膀为父母割草 一夜致富不改本色 来源:新浪 2015年06月30日 分享到: 更多 收藏 分享 被浏览5次   <ignore_js_op id="r_article_i ...

  5. Linux下软件安装,卸载,管理

    一. 软件安装包的类型 通常Linux应用软件的安装有五种: 1) tar+ gz包,如software-1.2.3-1.tar.gz.     他是使用UNIX系统的打包工具tar打包的. 2) r ...

  6. dll显式加载与隐式加载

    使用动态DLL有两种方法,一种是隐式链接,一种是显式链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接. 两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样 ...

  7. 【Hibernate 4】一对多映射配置

    一.一对多映射简介 建立一对多关系关系的表的原则是将一的一方的主键加入到多的一方的表作为外键.这里以学生和班级为例子来演示.以前不用hibernate时建立pojo类要在学生类Student中加入一个 ...

  8. 022 ARM寄存器详解

    R13:堆栈指针寄存器 SP R14:链接寄存器 LR R15:程序计数器 PC指针 CPSR:当前程序状态寄存器 SPSR:备份程序状态寄存器

  9. PHP开发大型项目的一点经验

    一.变量 最好是把所有的变量存储在一个数组中,这样在程序的开发中可以带来很多的方便,特别是当程序很大的时候.变量的命名就当适合自己的习惯,不管是用拼音还是英语,至少应当有一定的意义,以便适合记忆.变量 ...

  10. CentOS学习笔记--MySQL安装

    MySQL安装 Linux中使用最广泛的数据库就是MySQL,使用在线yum的方式安装的版本落后MySQL网站好几个小版本,本节亲自测试安装新版的MySQL. 测试机器环境: VMware Works ...