Android Handler详解

来源:互联网 发布:建筑软件行业 编辑:程序博客网 时间:2024/05/30 19:33

Android应用开发经常要进行网络操作,我们可采用AsyncTask和   Thread+Handler机制来实现  ,今天先总结   Thread+Handler  的使用方法,我们将网络操作放在Thread中,开发的时候要注意这一点,因为在Android2.3里面在网速给力的情况下,是不会出现anr异常的,but,在Android4.0往后所有的网络操作都必须放在线程或者异步任务里面,否则汇报一个异常,这个异常不怎么起眼(logcat打印为黄色),初学者经常会犯这个错误,所以我们要养成将网络操作放在线程和异步任务里面。

看代码:

首先我们要创建一个handler的实例,然后覆写其handleMessage()方法,这里方法体的操作为更新界面的操作。

private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {mMarkers = new ArrayList<Marker>();markerInfos = (List<MarkerInfo>) msg.obj;LatLng llA = null;OverlayOptions ooA = null;for (MarkerInfo markerInfo : markerInfos) {llA = new LatLng(markerInfo.getLongtitude(), markerInfo.getLatitude());ooA = new MarkerOptions().position(llA).icon(bdA).zIndex(9).draggable(true);mMarkers.add((Marker) (mBaiduMap.addOverlay(ooA)));// 将位置添加至地图}};};

耗时操作:

new Thread(new Runnable() {@Overridepublic void run() {try {while (FLAG) {markerInfos = MarkerService.getMarkerInfo(RoutePlanActivity.this, 31.4874500000, 120.3826130000);Message msg = handler.obtainMessage();msg.obj = markerInfos;Thread.sleep(1000);handler.sendMessage(msg);}} catch (Exception e) {e.printStackTrace();}}}).start();

这里使用handler.obtainMessage();方法获取一个Message对象,虽然我们可以直接new 一个Message对象出来,但是handler机制为我们提供了消息池,所以开发时我们应该使用   handler.obtainMessage()方法是从消息池取消息,可以增强应用性能。

handler提供了多个方法来发送消息:

post(Runnable r) //执行一个在主线程的操作
postAtFrontOfQueue(Runnable r) //post一个消息给一个继承自runnable的对象
postAtTime(Runnable r, long uptimeMillis) //在指定的时间

postDelayed(Runnable r, long delayMillis) 

sendEmptyMessage(int what) //发送一个空消息
sendEmptyMessageAtTime(int what, long uptimeMillis) //在制定的时间发送消息
sendEmptyMessageDelayed(int what, long delayMillis)//延迟delayMillis的时间发送空消息 
sendMessage(Message msg) //发送一个普通的消息
sendMessageAtFrontOfQueue(Message msg) //发送一个消息,这个消息位于消息队列的前端
sendMessageAtTime(Message msg, long uptimeMillis) //发送消息在指定的时间
sendMessageDelayed(Message msg, long delayMillis) //延时发送消息

总结:

以post开头的方法有个Runnable参数,这个的意思是在主线程中的操作,切记,一些后台的操作用send开头的方法就不会出现anry异常了。。。。


AsynTask以后再讲吧。




0 0
原创粉丝点击