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 Str