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 ...
随机推荐
- 【测试】模拟一个全表扫描的sql,对其进行优化走索引,并且将执行计划稳定到baseLine。
①创建表t3: SQL> create table t3 (id int); Table created. SQL; rows created. ②开启自动捕获并修改时间格式: SQL> ...
- tar: 从成员名中删除开头的“/”
在压缩文件时,当后面的备份目录使用绝对路径时,会出现: tar zcvf /usr/OutFile.tar.gz /data/CTest tar: 从成员名中删除开头的“/” 此时,对tar增加 ...
- 【MySQL】MySQL/MariaDB的优化器对in子查询的处理
参考:http://codingstandards.iteye.com/blog/1344833 上面参考文章中<高性能MySQL>第四章第四节在第三版中我对应章节是第六章第五节 最近分析 ...
- 在ASP.NET开始执行HTTP请求的处理程序之前
using Dscf.Client.Web.Class; using Dscf.Client.Web.DscfService; using Dscf.Client.Web.Handler; using ...
- mysql 常用sql操作语句
获取数据库里所有表 SELECT TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='数据库名' 获取表里 ...
- Android Malware Analysis
A friend of mine asked me help him to examine his Android 5.0 smartphone. He did not say what's wron ...
- Promise机制
Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js ...
- AnyCAD C++ SDK与OpenCASCADE互操作
AnyCAD SDK有.Net和C++两个版本,使用C++版本的AnyPlatformOcc模块可以实现与OpenCASCADE互操作. C++版本(VS2010 32bit)下载 在AOBridge ...
- ububtu 14.04 问题集合
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4168168.html 1.Chromium 中的flash插件问题: sudo apt-ge ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入
本篇将介绍Asp.Net Core中一个非常重要的特性:依赖注入,并展示其简单用法. 第一部分.概念介绍 Dependency Injection:又称依赖注入,简称DI.在以前的开发方式中,层与层之 ...