**摘要:**每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程。而由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作。如果在非UI线程直接对UI进行了操作,则会报错:CalledFromWrongThreadException:only the original thread that created a view hierarchy can touch its views。
Android为我们提供了消息循环的机制,我们可以利用这个机制来实现线程间的通信。那么,我们就可以在非UI线程发送消息到UI线程,最终让Ui线程来进行ui的操作。
对于运算量较大的操作和IO操作,我们需要新开线程来处理这些繁重的工作,以免阻塞ui线程。在发送http等网络请求时,会经常使用!
¶实例讲解
下面承接前几篇文章中对天气情况(Weather)的一些详细说明,继续完善,实现在Android客户端的一个天气预报功能的开发:
¶WeatherActivity主程序代码:
1 | package com.dm.weather; |
¶weather_activity界面布局代码
1 | <?xml version="1.0" encoding="utf-8"?> |
{ 布局代码中使用到的SwipeRefreshLayout Google官方下拉刷新控件将在下篇文章中介绍 }
¶在AndroidManifest.xml中添加获取网络的权限
1 | <uses-permission android:name="android.permission.INTERNET"></uses-permission><!--不要忘记设置网络访问权限--> |
¶最终效果预览:
¶总结:
非UI线程发送消息到UI线程分为两个步骤
1 发送消息到UI线程的消息队列:
1 | Message obtainMessage(int what,Object object) |
通过使用Handler, 构造一个Message对象,这个对象存储了是否成功标识what和json字符串,然后通过message.sendToTarget()方法把这条message放到消息队列中去。
2 处理发送到UI线程的消息:
ui线程中,我们覆盖了handleMessage
1 | public void handleMessage (Message msg) |
这个方法是处理分发给ui线程的消息,判断msg.what的值可以知道mThread是否成功获取数据,如果json字符串数据成功获取,那么可以通过msg.obj获取到这个对象,之后开始解析。
最后在使用布局中相应的TextView将数据填充,实现更新。