Android自定义的http网络框架

Android自定义的http网络框架

 

  为什么要自定义网络框架:

      Android项目中,40%以上会涉及到与后台的http网络。通常的项目都会

  用第三方的网络框架。第三方的网络框架存在扩展性低,兼容性等问题。

     

  自定义http网络框架的优点:高性能、高扩展、兼容性好。

    

 

  下面要实现的网络框架的特点:

      1、调用层傻瓜式调用网络请求,用户只需要传入Url,请求参数,所需要请求的类型

      2、支持json、图片、音频请求,可根据业务场景需要进行扩展

      3、回调的结果发生在主线程

 

   

      4、高性能,支持高并发,请求队列依次获取,可以设置最大并发数

  实现思路:

  http网络请求流程:应用层(Activty)持有IrosonseListeren调用Volley层,Volley根据不同的请求类型(json、图片、音频)生产不同的Httptask,Httptask根据请求类型切换到子线程调用不同的IhttpService,IhttpService持有Ihttplistener进行网络请求和获取inputStream,Ihttplistener解析inputSteam后,切换到主线程,让应用层Activity回调IrosonseListeren获取网络请求返回的值。

      1、应用了生成者消费者模式,应用层(Activity)生成任务,放入请求队列,

      供线程池(threadPool)调用。

      2、应用了策略模式,使得不同的请求实现IhttpService ,选择执行

   json、图片、音频等网络请求和处理,保证了功能的扩展性。

      3、使用了装饰器模式,将请求类型的选择处理逻辑放在了Volley层,使得

   应用层可以傻瓜式调用。

 

  实现思路图:

  

 

 

     

  代码实现:

  

  public class MainActivity extends AppCompatActivity {

private String url="http://114.55.30.161/nms3/mmsWebDeviceThree/getDeviceByOrgans.do";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}

public void volleynet(View view){
TaskParams tp=new TaskParams(url,
// new String[]{"home_id", ""},
new String[]{"organId", "15"}

);
//json请求
Volley.sendjsonRequest(tp.getEncodeParams(), tp.getUrl(), new IJsonListener() {

@Override
public void onSuccess(String response) {
Log.e("jjjjjj","userResponse---->"+response.toString());
Toast.makeText(getApplicationContext(),response.toString(),Toast.LENGTH_SHORT).show();
}

@Override
public void onError() {

}
});

//图片请求扩展
// Volley.sendImgRequest(tp.getEncodeParams(), tp.getUrl(), new IImagListener() {
//
// @Override
// public void onSuccess(String response) {
//
// }
//
// @Override
// public void onError() {
//
// }
// });

//获取音频扩展
}
}

   

 

public class TaskParams {

//http://192.168.1.50:4501/IF/SIM/sim_task.aspx?CELL_WIDTH=800&CELL_HEIGHT=480&BOX_SIGNATURE=070457c801902417668&number=2&task_type=0
private static String CELL_WIDTH="CELL_WIDTH";
private static String CELL_HEIGHT="CELL_HEIGHT";
private static String BOX_SIGNATURE="BOX_SIGNATURE";
private String url;
private static String NUM = "number";
private static String TYPE = "task_type";
private static String USER_ID = "user_id";

private Map<String, String> params;

private TaskParams() {
}

public TaskParams(String url, int cell_width, int cell_heith, String box_signature, int num, int type) throws ParamsInvaliedException {
params = new HashMap<String, String>();
if (url == null) {
throw new ParamsInvaliedException("task count is invalied");
} else {
this.url = url;
}

params.put(CELL_WIDTH, String.valueOf(cell_width));
params.put(CELL_HEIGHT, String.valueOf(cell_heith));
params.put(BOX_SIGNATURE, box_signature);

params.put(NUM, String.valueOf(num));

//params.put(TYPE, String.valueOf(type));

// params.put(USER_ID, Common.USER_Id);
}

public TaskParams(String url, String[]... para){
params = new HashMap<String, String>();
this.url = url;
if(para != null){
for(int i = 0; i < para.length; i++){
String[] p = para[i];
if(p.length != 2){
continue;
}
this.params.put(p[0], p[1]);
}
}
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getEncodeParams() {
try {
StringBuilder encodedString = new StringBuilder();
boolean first = true;
for (String key : params.keySet()) {
String value = params.get(key);
if (value.equals(""))
continue;
if (first)
first = false;
else
encodedString.append("&");
encodedString.append(URLEncoder.encode(key, "UTF-8")).append("=")
.append(URLEncoder.encode(value, "UTF-8"));
}
return encodedString.toString();
} catch (UnsupportedEncodingException e) {
return null;
}
}

public static class ParamsInvaliedException extends Exception {
private static final long serialVersionUID = 1L;

public ParamsInvaliedException(String s) {
super(s);
}
}
}

  

 

      public class Volley {
//供调用层调用
public static void sendjsonRequest(String params,
String url,IJsonListener httpCallable){
//回调
IHttpListener httpListener=
new JSONDealListener(httpCallable);

//实例化http网络请求线程线程
HttpTask httpTask=new HttpTask(params,url,httpListener,new JSONHttpSercice());

ThreadPoolManager.getInstance().execute(new FutureTask<Object>(httpTask,null));


}

//图片访问 供扩展用
// public static void sendImgRequest(String params,
// String url,IImagListener httpCallable){
// //回调
// IHttpListener httpListener=
// new ImageDealListener(httpCallable);
//
// //实例化http网络请求线程线程
// HttpTask httpTask=new HttpTask(params,url,httpListener);
//
// ThreadPoolManager.getInstance().execute(new FutureTask<Object>(httpTask,null));
//
//
// }

}

 

public class HttpTask implements Runnable{
private IHttpService httpService;
public HttpTask(String params,
String url,IHttpListener iHttpListener,IHttpService httpService){
this.httpService=httpService;
httpService.setUrl(url);
httpService.setHttpCallBack(iHttpListener);

params = params.replace("%40", "@");

try {
this.httpService.setRestquestDate(params.getBytes());
} catch (Exception e) {
e.printStackTrace();
}

}

@Override
public void run() {
//执行网络请求
this.httpService.excute();
}
}

//处理请求后的回调,是否请求
// 成功、失败后的操作
public interface IHttpListener {

void onSuccess(InputStream inputStream);

void onError();
}
 

//处理网络请求的接口
public interface IHttpService {
//请求url
void setUrl(String url);
//执行请求,专门处理inputStream
void excute();
//设置回调接口
void setHttpCallBack(IHttpListener iHttpListener);
//设置请求参数
void setRestquestDate(byte[] restquestDate);

}


//提供调用层使用
public interface IJsonListener{
void onSuccess(String response);

void onError();
}
 
//处理JSON相应请求
public class JSONDealListener implements IHttpListener {

//请求返回解析后的回调
private IJsonListener jsonListener;

//切换到主线程
Handler handler=new Handler(Looper.getMainLooper());

public JSONDealListener(IJsonListener jsonListener) {
this.jsonListener = jsonListener;
}

@Override
public void onSuccess(InputStream inputStream) {
//解析网络请求的响应流
final String content=getContent(inputStream);


//切换到主线程
handler.post(new Runnable() {
@Override
public void run() {
if(jsonListener!=null){
//主线程调用
jsonListener.onSuccess(content);
}
}
});
}

//解析响应流
private String getContent(InputStream inputStream) {
String content=null;
try {
BufferedReader reader=
new BufferedReader(new InputStreamReader(inputStream));

StringBuilder sb=new StringBuilder();

String line=null;

while((line=reader.readLine())!=null){
sb.append(line+"\n");
}

return sb.toString();
}catch (Exception e){
System.out.println("Error="+e.toString());
}finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

return content;
}

@Override
public void onError() {

}
}



public class JSONHttpSercice implements IHttpService {
IHttpListener httpListener;
String url;

private byte[] requestData;

@Override
public void setUrl(String url) {
this.url = url;
}

@Override
public void setRestquestDate(byte[] restquestDate) {
this.requestData=restquestDate;
}

@Override
public void excute() {

HttpURLConnection conn = null;
OutputStream out = null;
InputStream in = null;

try {
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
conn.setDoOutput(true);

out = conn.getOutputStream();

out.write(requestData);
out.flush();
out.close();

int code = conn.getResponseCode();
if (code != HttpURLConnection.HTTP_OK) {
// return null;
}

in = conn.getInputStream();

httpListener.onSuccess(in);
// String resstr = HttpUtils.changeInputStream2(in);
} catch (IOException e) {
e.printStackTrace();
}



}

@Override
public void setHttpCallBack(IHttpListener iHttpListener) {
this.httpListener=iHttpListener;
}


}
 
//线程池管理
public class ThreadPoolManager {
private static ThreadPoolManager
instance=new ThreadPoolManager();

public static ThreadPoolManager getInstance() {
return instance;
}

private ThreadPoolExecutor threadPoolExecutor;

private LinkedTransferQueue<Future<?>> service=new LinkedTransferQueue<>();

private ThreadPoolManager(){
threadPoolExecutor=new ThreadPoolExecutor(4,10,10, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(4),handler);
threadPoolExecutor.execute(runnable);
}

private Runnable runnable =new Runnable() {
@Override
public void run() {
FutureTask futureTask=null;

while (true){
try {
futureTask= (FutureTask) service.take();
} catch (InterruptedException e) {
e.printStackTrace();
}

if(futureTask!=null){
threadPoolExecutor.execute(futureTask);
}
}
}
};

public <T> void execute(FutureTask<T> futureTask){
if(futureTask!=null){
try {
service.put(futureTask);
}catch (Exception e){
e.printStackTrace();

}
}
}

private RejectedExecutionHandler handler=new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) {
service.put(new FutureTask<Object>(runnable,null));
}
};

}
 

Github地址:https://git.oschina.net/qpww/myVolley.git
posted @ 2017-03-28 19:44  kerryqpw  阅读(1274)  评论(0编辑  收藏  举报