Android 通用网络框架封装
2017-06-18 16:58
344 查看
随着我们Android不断的发展, 网络框架亦是层出不穷,亦是在不断进步之中。 我们面对网络框架的不断升级.
1.自己封装的网络框架
2.Xutil网络框架
3.AsyncyHttp网络框架
。
。
Volley 网络框架
OkHttp网络框架
Retrofit 网络框架
。
。
更新的网络框架。
随着历史的发展网络框架一直在变化,一直在升级。
每一次改动网络框架,就把app交互代码改变一次,那么成本将会急剧增加。
所以我们应该设计一个中间层 与 app交互进行隔离。
这里就用到代理模式
这有个网上流传最经典的(王婆 与 西门官人)虽然有点污 但是很贴切说明了 代理之间的关系。
代理 持有 被代理人的共同的方法。
我们拿到此代理, 将来被代理人发生变化时我们只需将代理持有对象变化即可。App交互之间代码则不需要改变
来看代码。
代理类,网络请求最后抽象出最基本最公共的 get 和 post请求。
回调借口 抽象出最基本的 请求成功和请求失败两个方法
我们回调接口 再加一个层,用来将返回的数据进行Gson解析层。然后以泛型的形式 返回。
代理类 实现 公共代理IHttpProcessor的接口
编写Volly实现的类
自己找一个 Url 地址返回一个Json
编写一个Gosn的实体类 编写我们的具体Volly的网络请求配置
Application 中对 代理设置使用哪一种网络框架
Gradle 文件配置 所需的网络框架
配置网络请求设置
编写测试代码 我们测试一下
就可以成功请求到数据
我们Volly网络框架请求成功后
我们测试另一个网络框架OkHttp
我们需要注意 OkHttp是在子线程里面, 我们需要通过Handler将返回结果转到主线程里面
此时我们只需改一处配置 在Application里面改变代理配置,我们就可以从Volly框架转到OkHttp上面了。 而其他交互层代码 无感知的换了底层。
简单的书写 不足之处 还望指正
邮箱 zhangdanjiang_java@163.com
GitHub 地址 https://github.com/JiangGeJavaAndroid/Demo01
1.自己封装的网络框架
2.Xutil网络框架
3.AsyncyHttp网络框架
。
。
Volley 网络框架
OkHttp网络框架
Retrofit 网络框架
。
。
更新的网络框架。
随着历史的发展网络框架一直在变化,一直在升级。
每一次改动网络框架,就把app交互代码改变一次,那么成本将会急剧增加。
所以我们应该设计一个中间层 与 app交互进行隔离。
这里就用到代理模式
这有个网上流传最经典的(王婆 与 西门官人)虽然有点污 但是很贴切说明了 代理之间的关系。
代理 持有 被代理人的共同的方法。
我们拿到此代理, 将来被代理人发生变化时我们只需将代理持有对象变化即可。App交互之间代码则不需要改变
来看代码。
代理类,网络请求最后抽象出最基本最公共的 get 和 post请求。
import java.util.Map; /** * Author : * Time : 2017/6/16 15:41 * Function : * 代理接口 代理和真正干活的类 的 共同实现的接口 * Mail : zhangdanjiang_java@163.com */ public interface IHttpProcessor { // Get void get(String url, Map<String, Object> params, ICallBack callBack); //Post void post(String url, Map<String, Object> params, ICallBack callBack); //Update //Delete //... }
回调借口 抽象出最基本的 请求成功和请求失败两个方法
/** * Author : * Time : * Function : * * 网络层走的是byte 网络给我们的最终的String * * Mail : zhangdanjiang_java@163.com */ public interface ICallBack { void onSuccess(String string); void onFailed(String string); }
我们回调接口 再加一个层,用来将返回的数据进行Gson解析层。然后以泛型的形式 返回。
import com.google.gson.Gson; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; /** * Author : * Time : * Function : * * 利用泛型实现通用的回调接口 * * Mail : zhangdanjiang_java@163.com */ public abstract class HttpCallback<Result> implements ICallBack { @Override public void onSuccess(String result) { Gson gson = new Gson(); Class<?> cls = analysisClzzInfo(this); Result objResult = (Result) gson.fromJson(result, cls); onSuccess(objResult); } public abstract void onSuccess(Result result); /** * 利用反射获得类的信息 * @param object * @return Class<?> 需要实现的Json解析类 */ private Class<?> analysisClzzInfo(Object object) { Type genType = getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); return (Class<?>) params[0]; } }
代理类 实现 公共代理IHttpProcessor的接口
import java.util.Map; /** * Author : * Time : * Function : * 代理类 * Mail : zhangdanjiang_java@163.com */ public class HttpHelper implements IHttpProcessor{ /** * 被代理的对象 */ private static IHttpProcessor mIHttpProcessor; private static HttpHelper instance; private HttpHelper(){ } public static HttpHelper getInstance() { if (instance == null) { instance = new HttpHelper(); } return instance; } /** * 初始化立即启动 * 传入被代理的对象,Volly实现类 okHttp实现类 等等 * */ public static void init(IHttpProcessor httpProcessor){ mIHttpProcessor = httpProcessor; } @Override public void get(String url, Map<String, Object> params, ICallBack callBack) { mIHttpProcessor.get(url, params, callBack); } @Override public void post(String url, Map<String, Object> params, ICallBack callBack) { mIHttpProcessor.post(url, params, callBack); } }
编写Volly实现的类
自己找一个 Url 地址返回一个Json
编写一个Gosn的实体类 编写我们的具体Volly的网络请求配置
import android.content.Context; import android.util.Log; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import java.util.Map; /** * Author : * Time : * Function : * Mail : zhangdanjiang_java@163.com */ public class VolleyProcessor implements IHttpProcessor{ private final static String TAG = "VolleyProcessor"; private static RequestQueue mQueue = null; public VolleyProcessor(Context context) { mQueue = Volley.newRequestQueue(context); } @Override public void get(String url, Map<String, Object> params, final ICallBack callBack) { StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d(TAG, "onSuccess response==" + response); callBack.onSuccess(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { String toString = "null"; if (error != null) { toString = error.toString(); } Log.d(TAG, "onErrorResponse error ==" + toString); callBack.onFailed(error.toString()); } }); mQueue.add(stringRequest); } @Override public void post(String url, Map<String, Object> params, final ICallBack callBack) { StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d(TAG, "onSuccess response==" + response); callBack.onSuccess(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { String toString = "null"; if (error != null) { toString = error.toString(); } Log.d(TAG, "onErrorResponse error ==" + toString); callBack.onFailed(error.toString()); } }); mQueue.add(stringRequest); } }
Application 中对 代理设置使用哪一种网络框架
import android.app.Application; /** * Created by jiang on 2017/6/17. */ public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); // HttpHelper.init(new VolleyProcessor(this)); HttpHelper.init(new OkHttpProcessor()); } }
Gradle 文件配置 所需的网络框架
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { applicationId "com.jing.demo01" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' compile 'org.xutils:xutils:3.5.0' compile 'com.google.code.gson:gson:2.8.1' compile 'com.github.erd:android-volley:1.0.0' compile 'com.squareup.okhttp3:okhttp:3.8.0' }
配置网络请求设置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jing.demo01"> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:name=".MyApplication" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
编写测试代码 我们测试一下
就可以成功请求到数据
package com.jing.demo01; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Toast; import com.jing.demo01.bean.RotateBean; import java.util.HashMap; public class MainActivity extends AppCompatActivity { private String url = HttpUtil.GET_SERIAL_ROTATE; private HashMap<String , Object> params = new HashMap<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //测试提交数据 findViewById(R.id.text).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { HttpHelper.getInstance().get(url, params, new HttpCallback<RotateBean>() { @Override public void onSuccess(RotateBean rotateBean) { toast("请求成功"); } @Override public void onFailed(String string) { toast("请求失败"); } }); } }); // 在测试 } public void toast(String string){ Toast.makeText(this, string , Toast.LENGTH_SHORT).show(); } }
我们Volly网络框架请求成功后
我们测试另一个网络框架OkHttp
import android.os.Handler; import android.util.Log; import java.io.IOException; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; /** * Created by jiang on */ public class OkHttpProcessor implements IHttpProcessor { private final String TAG = "OkHttpProcessor"; private OkHttpClient mOkHttpClient; private Handler myHandler; public OkHttpProcessor() { mOkHttpClient = new OkHttpClient(); myHandler = new Handler(); } @Override public void get(String url, Map<String, Object> params, final ICallBack callBack) { final Request request = new Request.Builder() .get() .url(url) .build(); mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(TAG, "onFailure e ==" + e); callBack.onFailed(e.toString()); } @Override public void onResponse(Call call, final Response response) throws IOException { if (response == null) { Log.d(TAG, "onSuccess response== null"); return; } Log.d(TAG, "onSuccess response==" + response.toString()); if (response.isSuccessful()) { final String result = response.body().string(); Log.d(TAG, "onSuccess result==" + result); myHandler.post(new Runnable() { @Override public void run() { callBack.onSuccess(result); } }); } else { myHandler.post(new Runnable() { @Override public void run() { callBack.onFailed(response.message().toString()); } }); } } }); } @Override public void post(String url, Map<String, Object> params,final ICallBack callBack) { RequestBody requestbody = appendBody(params); final Request request = new Request.Builder() .post(requestbody) .url(url) .build(); mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call,final IOException e) { Log.d(TAG, "onFailure e ==" + e); myHandler.post(new Runnable() { @Override public void run() { callBack.onFailed(e.toString()); } }); } @Override public void onResponse(Call call, final Response response) throws IOException { if (response == null) { Log.d(TAG, "onSuccess response== null"); return; } Log.d(TAG, "onSuccess response==" + response.toString()); if (response.isSuccessful()) { final String result = response.body().string(); myHandler.post(new Runnable() { @Override public void run() { callBack.onSuccess(result); } }); } else { myHandler.post(new Runnable() { @Override public void run() { callBack.onFailed(response.message().toString()); } }); } } }); } /** * 快速构建参数 * @param params * @return */ private RequestBody appendBody(Map<String, Object> params) { FormBody.Builder body = new FormBody.Builder(); if (params == null || params.isEmpty()) { return body.build(); } for (Map.Entry<String, Object> entry: params.entrySet()) { body.add(entry.getKey(), entry.getValue().toString()); } return body.build(); } }
我们需要注意 OkHttp是在子线程里面, 我们需要通过Handler将返回结果转到主线程里面
此时我们只需改一处配置 在Application里面改变代理配置,我们就可以从Volly框架转到OkHttp上面了。 而其他交互层代码 无感知的换了底层。
简单的书写 不足之处 还望指正
邮箱 zhangdanjiang_java@163.com
GitHub 地址 https://github.com/JiangGeJavaAndroid/Demo01
相关文章推荐
- android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件
- android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件
- Android之封装好的异步网络请求框架
- Android之封装好的异步网络请求框架
- Android通用网络请求解析框架.4(代码实现,分支部分)
- Android通用网络请求解析框架.7(同步请求,公共部分)
- Android基于http封装的网络请求框架
- Android 网络通信框架Volley的二次封装
- android网络访问框架OkHttp的进一步封装
- 自己封装的android客户端http网络框架
- Android 网络框架 Retrofit2.0介绍、使用和封装
- Android通用网络请求解析框架.8(同步请求,分支部分)
- android http——网络请求二次封装的框架设计
- Android二次封装的网络框架 AndNet
- 对Android官方网络框架——volley的封装
- RxAndroid+Retrofit+GreenDao+MVP框架---通用基类封装(三)
- Android网络框架之----OKHttp简单二次封装
- Android通用网络请求解析框架.1(需求,思想)
- 基于Retrofit、OkHttp、Gson封装通用网络框架
- 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)