在安卓开发中使用第三方sdk这是必不可少的环节,大多sdk在我们一番研究后基本可以实现其功能,但是如何正确优雅的使用第三方sdk呢。
下面就通过代理模式使用sdk让大家明白如何正确的使用第三方sdk:其优点主完全贯穿了高内聚低耦合,下面我通过网络请求的功能作为例子来说明。
1,功能的起始点main,一个简单的按钮
public class MainActivity extends Activity {
private Map<String, Object> parm = new HashMap<>();
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//一个简单的按钮作为一切功能的起始点
findViewById(R.id.tv_tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MyProxy.obtion().get("http://192.168.1.129/hangban.txt", parm, new CallBack() {
@Override
public void onSuccess(Object response) {
LogTools.logi("tag",response.toString());
}
@Override
public void onFailed(String failed) {
}
});
}
});
}
}
简单的接口
public interface CallBack<T>{
void onSuccess(T response);
void onFailed(String failed);
}
代理类通过接口协议功能
public class MyProxy implements Ihttp{
//单例模式
public static MyProxy mInstance;
public MyProxy () {
mInstance = this;
}
public static MyProxy obtion(){
if (mInstance==null){
synchronized (MyProxy .class){
if (mInstance==null){
mInstance = new MyProxy ();
}
}
}
return mInstance;
}
private static Ihttp mIhttp = null;
//初始化哪种网络框架
public static void init(Ihttp ihttp){
mIhttp = ihttp;
}
@Override
public void post(String url, Map<String, Object> params, CallBack callBack) {
mIhttp.post( url, params, callBack);
}
@Override
public void get(String url, Map<String, Object> params, CallBack callBack) {
mIhttp.get(url, params, callBack);
}
}
协议接口,统一代理类和model类的功能
public interface Ihttp {
public void post(String url , Map<String ,Object> params,CallBack callBack);
public void get(String url , Map<String ,Object> params,CallBack callBack);
}
网络框架实现类更换框架只需更换一个mode类即可,凡是第三方sdk皆可使用此模式
public class NetworkMode<T> implements Ihttp {
public static OkHttpClient okHttpClient;
public static NetworkMode instance;
public NetworkMode(Context context) {
instance = this;
}
public static NetworkMode getInstance(Context context){
if (instance==null){
synchronized (NetworkMode.class){
if (instance==null){
instance = new NetworkMode(context);
}
}
}
return instance;
}
@Override
public void post(String url, Map<String, Object> params, CallBack callBack) {
RequestBody formBody = new FormBody.Builder()
.add("key", params.toString())
.build();
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
Response response = null;
try {
response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
callBack.onSuccess( response.body().string());
} else {
throw new IOException("Unexpected code " + response);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void get(String url, Map<String, Object> params, CallBack callBack) {
LogTools.logi("tag","xturl="+url);
okhttp3.Request request = new okhttp3.Request.Builder().url(url).get().build();
OkHttpClient okHttpClient = new OkHttpClient();
final Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
LogTools.logi("tag", "onFailure: " + e.getMessage().toString());
}
@Override
public void onResponse(Call call, okhttp3.Response response) throws IOException {
// callBack.onSuccess(response.body().string());
LogTools.logi("tag", "response: " + response.body().string());
}
});
}
}
使用之前初始化代理类即可
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
MyProxy.init(NetworkMode.getInstance(getApplicationContext()));
//只需一步即可跟换框架
// MyProxy.init(retrofitNetworkMode.getInstance(getApplicationContext()));
}
}
可以写多个,多种框架的mode,在开发中只需导入一行代码初始化即可更换sdk,