轉載註明出處:http://blog.csdn.net/codingandroid/article/details/41748007
之前看網上的一些網絡框架,多少存在一些bug,大多還沒有源碼,有些有源碼,框架過於太大,發現了bug修改起來也實在費事,所以使用自己的網絡框架是最佳選擇哦,這個框架我這裏有借鑑一些其他框架的地方,不過提供功能就是 post 請求網絡。
Android使用 HttpClient 和 HttpURLConnection,當然他們都存在一些缺陷,自己通過socket去寫http協議稍顯得麻煩,暫時先用着吧。
簡單說說HttpClient 和 HttpURLConnection 這兩個玩意兒的缺陷 Android 下使用DefaultHttpClient 去訪問網絡經常會報一個 NoHttpResponseException 這玩意兒簡單看來好像本地資源不夠用,導致線程被殺死了,細看,妹的,老子就開一個應用,資源綽綽有餘,再細細去搜,就知道那個是DefaultHttpClient的一個缺陷,當然大家都說DefaultHttpClient缺陷很多,暫時也就不多列了,這個是最讓我頭疼的,有人說那麼這個既然不能用,那麼就果斷換成HttpURLConnection這個就行啦,那麼問題來了,測試過程中如果夠細心你會發現一個叫 EOFException 這個的異常,難道是流木有關閉??折騰半天后可以發現,這個是HttpUrlConnection 的一個缺陷,當然網上也會有不少的解決方法,我把那些方法都加上了,還是偶然會出現這個異常,那先不管了,我想這個有時間必須要自己寫一個,哎。目前在兩個框架裏我加了一些處理,還是出現這個異常的話,那對不起了,抓住後拋出一個timeout的異常就當超時處理了
下面簡單介紹一下這個框架
將請求 解析數據,請求成功後的處理和失敗後處理都分開,集中處理異常,請求都放到線程池中,當退出一個頁面的時候,將這個頁面沒有沒有結束的線程都結束掉,節省一些資源等等,之後會作一一的介紹
好了,下面看看如何這個框架的代碼
package com.clxu.netframe;
import java.util.HashMap;
import org.json.JSONException;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.clxu.netframe.base.NetworkBaseActivity;
import com.clxu.netframe.constant.Constant;
import com.clxu.netframe.exception.MyException;
import com.clxu.netframe.net.AsyncUrlConnectionPost;
import com.clxu.netframe.net.callback.ParseCallback;
import com.clxu.netframe.net.callback.ResultCallback;
import com.clxu.netframe.util.LogUtil;
/***
* @function 輕型網絡框架使用
*
* @author CLXU
*
* 2014-12-5
*/
public class MainActivity extends NetworkBaseActivity implements OnClickListener {
TextView text;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.tv_test);
button = (Button) findViewById(R.id.bt_test);
text.setText("這裏展示測試數據");
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_test:
text.setText("這裏展示測試數據");
doRequest();
break;
default:
break;
}
}
/***
* 這裏是調用的示範
*/
private void doRequest(){
String url = "http://192.168.131.211/epapp/apk/version_inspection.json";
HashMap<String, String> map = new HashMap<String, String>();//初始化一個map對象
map.put("user_id", ""); //存入數據
map.put("user_pwd", "");
if (!TextUtils.isEmpty(url)) {
// AsyncUrlConnectionPost 將這個類名改爲 AsyncHttpClientPost 這個 就是使用 HttpClient執行 post方法了
AsyncUrlConnectionPost asyncBaseRequest = new AsyncUrlConnectionPost(url,
map, new ParseCallback() {
@Override
public Object parse(String json)
throws JSONException {
//這裏對數據進行解析 至於使用XML 還是 json 還是直接使用的數據,我就不操心了,看你具體的需求
//把解析完的數據return 出去
LogUtil.d("return message="+json);
return json;
}
}, new ResultCallback() {
@Override
public void onSuccess(final Object obj) {
//這裏的 obj 就是之前 pause 方法解析後 return 的數據
LogUtil.d("onSuccess message="+obj.toString());
runOnUiThread(new Runnable() {
public void run() {
text.setText(obj.toString());
}
});
}
@Override
public void onFail(final MyException e) {
//這邊是各種異常,可以捕獲處理
runOnUiThread(new Runnable() {
@Override
public void run() {
if(e.getErrorCode() == Constant.NETWORK_REQUEST_IOEXCEPTION_CODE){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_IOEXCEPTION_CODE){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_SOCKET_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_CONNECT_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_TIMEOUT_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_PERRMIT_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_UNKNOWN_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}
}
});
}
});
mDefaultThreadPool.execute(asyncBaseRequest);
mAsyncRequests.add(asyncBaseRequest);
}
}
}
使用的時候很簡單哦 NetworkBaseActivity就繼承這個基類就Ok了。
後面會對這個框架進行解剖分析
框架下載地址:http://download.csdn.net/detail/brightshadow11111/8228287