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() {
@Override
public 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以后再讲吧。