贈送 HttpClient 和HttpURLConnection 的輕型網路框架 ---》使用介紹
之前看網上的一些網路框架,多少存在一些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了。
後面會對這個框架進行解剖分析