今天在慕课网上看了一个模板方法模式的课程,发现自己在安卓通用类库中已经用过这种模式,只是不知道叫什么。
在安卓通用类库中的具体使用:
在com.yousu.HttpTask中具体的使用:
1.首先定义抽象模板基类HttpTask,定义抽象方法onCallBack(JsonObject json)。其中将网络获取的字符串转换为jsonobject对象已在基类中中实现。
2.由于有可能要在网络出现问题是定义不同的处理方式,因此要写一个“钩子方法”,当出现网络连接问题时,重写该方法。该方法有默认方法体,也可以不重写,使用默认实现。
public abstract class HttpTask extends AsyncTask<HttpRequestEntity, integer, String> {
private Activity activity;
private String mimeType;
@Override
protected String doInBackground(HttpRequestEntity... request) {
// TODO Auto-generated method stub
HttpRequestEntity _request = (HttpRequestEntity) request[0];
List<NameValuePair> http_params = _request.getParams();
String ip = _request.getIp();
String result = null;
try {
result = HttpConnection.sendHttpRequest(ip,http_params);
} catch (HttpHostConnectException e) {
Log.i("yousu", "HttpHostConnectException",e);
// TODO: handle exception
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
Log.i("yousu", "ClientProtocolException",e);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.i("yousu", "IOException",e);
}
return result;
}
@Override
protected void onPostExecute(String result){
Context applicationContext = CustomApplication.getInstance().getApplicationContext();
if (result==null) {
Toast.makeText(applicationContext, "连接错误", Toast.LENGTH_SHORT).show();
onConnectError();
return;
}
JSONObject json = null;
try {
json = new JSONObject(result);
} catch (JSONException e) {
// TODO Auto-generated catch block
Log.i("yousu", result);
onResultTypeError(result);
Toast.makeText(applicationContext, "返回值格式错误", Toast.LENGTH_SHORT).show();
if (activity!=null) {
View v = LayoutInflater.from(activity).inflate(R.layout.web_info_dialog, null);
WebView wv = (WebView)v.findViewById(R.id.webView1);
wv.loadData(result, mimeType, null);
new AlertDialog.Builder(activity).setView(v).setNegativeButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
}).create().show();
}
}
if (json!=null) {
try {
callback(json);
} catch (JSONException e) {
// TODO Auto-generated catch block
Toast.makeText(applicationContext, "返回值中不存在要提取的字段", Toast.LENGTH_SHORT).show();
}
}
}
/**
* 当返回值类型为json时,调用的回调方法
* @param json 返回的json
* @throws JSONException 要提取的字段不存在时,抛出该异常。
*/
public abstract void callback(JSONObject json) throws JSONException;
/**
* 连接错误时调用该方法,如果有自定义操作,应重写此方法。
*/
public void onConnectError(){
}
/**
* 返回值格式错误时调用该方法,如果有自定义操作,应重写此方法(此即钩子方法)。
* @param result 返回的字符串
*/
public void onResultTypeError(String result){
}
public HttpTask showResult(Activity activity,String mimeType){
this.activity = activity;
this.mimeType = mimeType;
return this;
}
}