“Perl之父Larry Wall说到“懒惰、傲慢、缺乏耐性是程序员的三大美德”。
我可能已经具备了一个程序开发人员应具有的美德吧——懒于书写基本一样的代码,即使封装一个新的方法需要更多时间。
Android系统如果在主线程访问网络会抛出异常,导致程序退出。为此,Google提供了AsyncTask这样一个异步线程类。使用很方便,但是如果直接用会可能会比较麻烦(至少我这样人为)。在公司上一个Android项目中封装了一个类,用这个类可以很方便地使用AsyncTask。
其中Paser为解析器接口,用于解析服务器返回的数据;GateWay接口为网络出口类;UpdateUI用于更新UI。
/**
* 基于Android异步线程(AsyncTask)的网络操作类 <br>
* 因为AsyncTask不能重用,所以该类在一次execute后也不能重用<br>
* 使用方法:<br>
* <p>
* new NetLoader(parser,update).execute(order);
* </p>
*或<p>
* NetLoader.run(order,parser,upUi);
*</p>
* @author Memory_Leak
*/
public class NetLoader<T> extends AsyncTask<Order, Void, Result<T>> {
private Parser<T> parser = null;
private UpdateUI<T> updateUI = null;
/**
* @param parser 解析器
* @param updateUI 更新UI
* @see ireal.here.data.Parser
* @see UpdateUI
*
*/
public NetLoader(Parser<T> parser, UpdateUI<T> updateUI) {
this.parser = parser;
this.updateUI = updateUI;
}
@Override
protected Result<T> doInBackground(Order... params) {
GateWay gateWay = new HttpGateWay(true);
return gateWay.send(params[0], parser);
}
@Override
protected void onPostExecute(Result<T> result) {
super.onPostExecute(result);
if (updateUI == null)
return;
updateUI.update(result);
}
public static <T> void run(Order<?> order, Parser<T> parser, UpdateUI<T> ui) {
new NetLoader<T>(parser, ui).execute(order);
}
}