Android线程---UI线程和非UI线程之间通信

当主线程sendMessage后,子线程便会调用handleMessage来获取你所发送的Message。我的主线程向子线程发送消息时携带了数据,子线程根据主线程发送来的数据进行数据库查询,并将查询后的结果返回给该主线程:

1  public class UpdataPeople extends Activity {

2

3     EditText updata_name;

4     EditText updata_phone;

5     EditText updata_address;

6     Button updata_quxiao;

7     Button updata_baocun;

8

9     String name;

10     String phone;

11

12     //创建一个子线程对象

13     UpdataThread updataThread ;

14

15     //定义一个全局变量,该Handler在主线程中重写HandleMessage。

16     //若不定义成为全局变量,则在子线程中无发用到该Handler

17     private Handler mainHandler = null;

18

19     //创建一个非UI线程

20     class UpdataThread extends Thread {

21

22         public Handler mhandler;

23

24         public void run() {

25             Looper.prepare();

26             mhandler = new Handler() {

27

28                 //定义处理消息的方法

29                 @Override

30                 public void handleMessage(Message msg) {

31                     //---这里面做一些耗时操作

32                     if (msg.what == 0x123) {

33                         //获取msg所携带的数据

34                         Bundle bundle = msg.getData();

35                         if (bundle != null) {

36                             String name = bundle.getString("name");

37                             String phone = bundle.getString("phone");

38                             Toast.makeText(getApplication(), "传值成功" + name + phone, Toast.LENGTH_LONG).show();

39                         } else {

40                             name = " ";

41                             phone = " ";

42                         }

43                         //创建并连接数据库,若该数据库已经存在,则打开该数据库

44                         CreateDatabaseHelper cdh = new CreateDatabaseHelper(getApplication(), "myPeople.db3", 1);

45                         //使用游标查询数据库,并返回结果集

46                         Cursor cursor = cdh.getReadableDatabase().rawQuery("select * from people where name = ? and phone = ?", new String[]{name, phone});

47                         //创建一个Bundle存储查询出来的结果

48                         Bundle dataAll = new Bundle();

49                         //遍历cursor,并将结果赋值给Bundle

50                         while (cursor.moveToNext()) {

51                             dataAll.putString("name", cursor.getString(1));

52                             dataAll.putString("phone", cursor.getString(2));

53                             dataAll.putString("address", cursor.getString(3));

54                         }

55     //↓↓↓↓↓↓↓这一块便是子线程将查询的结果返回给主线程↓↓↓↓↓↓↓

56                         //创建Message

57                         Message msg_main = new Message();

58                         msg_main.what = 0x456;

59                         //为Message添加数据

60                         msg_main.setData(dataAll);

61                         //向主线程发送消息

62                         mainHandler.sendMessage(msg_main);

63

64                     }

65                 }

66             };

67             Looper.loop();

68         }

69     }

70

71     @Override

72     protected void onCreate(Bundle savedInstanceState) {

73         super.onCreate(savedInstanceState);

74         //实例化Thread

75         updataThread = new UpdataThread();

76         //启动新线程

77         updataThread.start();

78         setContentView(R.layout.updatapeople);

79         //获取布局文件里的控件

80         updata_name = (EditText) findViewById(R.id.updata_name);

81         updata_phone = (EditText) findViewById(R.id.updata_phone);

82         updata_address = (EditText) findViewById(R.id.updata_address);

83         updata_quxiao = (Button) findViewById(R.id.updata_quxiao);

84         updata_baocun = (Button) findViewById(R.id.updata_baocun);

85

86         //获取启动该Activity的Intent

87         Intent intent = getIntent();

88         //取出Intent所携带的数据包

89         Bundle datas = intent.getExtras();

90         //取出包中所携带的各种数据

91         if (datas != null) {

92             name = datas.getString("name");

93             phone = datas.getString("phone");

94         } else {

95             name = "空";

96             phone = "空";

97         }

98 //↓↓↓↓↓↓↓这一块便是主线程向子线程发送消息↓↓↓↓↓↓↓↓

99         //创建消息

100         Message msg = new Message();

101         //为msg标记一下(类似与--key--)

102         msg.what = 0x123;

103         //创建一个Bundle,并存放数据

104         Bundle bundle = new Bundle();

105         bundle.putString("name", name);

106         bundle.putString("phone", phone);

107         //将数据添加到msg

108         msg.setData(bundle);

109         //向新线程发送消息

110         updataThread.mhandler.sendMessage(msg);

111

112         //接受子线程返回的消息和子线程那边的用法一样

113          mainHandler = new Handler() {

114             @Override

115             public void handleMessage(Message msg_main) {

116                 if (msg_main.what == 0x456){

117                     //更新UI(因为在UI 线程中可以进行UI的更新。。。)

118                     updata_name.setText(msg_main.getData().getString("name"));

119                 }

120             }

121         };

另外建议APP开发完可以做一个全面的检测:www.ineice.com

时间: 2024-10-01 05:42:14

Android线程---UI线程和非UI线程之间通信的相关文章

【Android】UI thread和非UI thread

参考http://www.cnblogs.com/mengdd/p/3418780.html UI线程即主线程,因其启动时与UI组件交互,所以称为UI线程 主要涉及android.widget and android.view两大组件

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

Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面: 即如何使用Thread+Handler的方式从非UI线程发送界面更新消息到UI线程. 概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),

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

目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Looper+MessageQueue深入详解Android异步处理四:AsyncTask的实现原理 Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainTh

Android自定义组件系列【12】——非UI线程绘图SurfaceView

一.SurfaceView的介绍 在前面我们已经会自定义View,使用canvas绘图,但是View的绘图机制存在一些缺陷. 1.View缺乏双缓冲机制. 2.程序必须重绘整个View上显示的图片,比较耗资源. 3.非UI线程无法更新View组件,所以会占用主线程资源,当需要在主线程中处理逻辑的时候会很慢. 在Android中为我们提供了一个SurfaceView来替代View实现绘制图形,一般在游戏绘图方面应用较广,所以如果是比较复杂的绘图建议使用SurfaceView. 二.SurfaceV

Android 非UI线程中更新UI

Android 非UI线程中更新UI runOnUiThread(new Runnable() { public void run() { onDown(null); } });

Android UI线程和非UI线程

UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的UI组件(components from the Android UI toolkit (components from the android.widget and android.view packages))发生交互. 所以main thread也叫UI thread也即UI线程. 系统不会为

Android在非UI线程中更新UI的方法

1.使用Thread+Handler实现非UI线程更新UI界面 private MyHandler mHandler = new MyHandler(); ...... mHandler.sendResult(MyHandler.UPDATE_VIEW, null); ...... private class MyHandler extends Handler{ private static final int UPDATE_VIEW = 0; @Override public void han

Android异步机制一:使用Thread+Handler实现非UI线程更新UI界面

概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程.而由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作.如果在非UI线程直接对UI进行了操作,则会报错: CalledFromWrongThreadException only the original thread that created a view hierarchy can tou

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

经常运行eclipse时,烧到手机出现,“停止运行”,这时候得通过logcat查log了.一般这种情况属于FATAL EXCEPTION,所以检索FATAL 或者 EXCEPTION,然后往下看几行 例子: 11-26 16:18:17.949: E/AndroidRuntime(5363): FATAL EXCEPTION: Thread-19311-26 16:18:17.949: E/AndroidRuntime(5363): Process: com.scme.jiance, PID:

Android非UI线程更新UI的几种方法

Android用于实现非UI线程与UI线程的交互方法如下: 1.Handler 2.Activity.runOnUIThread(Runnable) 3.View.Post(Runnable) 4.View.PostDelayed(Runnabe,long) 5.AsyncTask