1. 程式人生 > >贈送 HttpClient 和HttpURLConnection 的輕型網路框架 ---》使用介紹

贈送 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了。


後面會對這個框架進行解剖分析