您的位置:首页 > 理论基础 > 计算机网络

基于OkHttpUtils再次封装代码最简化

2017-12-04 11:40 441 查看
Okhttp3是当前最流行的一个网络请求框架,它支持post,get,put等各种网络请求,最重要的是内部还带有缓存机制非常好用,与RxJava框架完美结合再加上当前主流的设计模式MVP实现,是不是让我们的代码更加优雅,美观呢

,本人刚出文章,菜鸟一枚,有任何不足之处欢迎指教,我的主要思想还是基于接口回调实现的,由于项目紧就抽了空随便写了下,有点类似MVP,如果有

不怎明白MVP模式原理的看完之后对你会有所帮助,好了话不多说,直接上代码

主要的类是HttpUtils  引用了一个OkhttpUtils工程,稍后附上源码地址

package com.example.administrator.myproject;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;

import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
* Created by LiuYX on 2017/12/1/001.
*/

public class HttpUtils implements HttpSendModel {
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
private static HttpModel httpModel;
private Context context;

@Override
public void sendHttp(Context context,HttpModel httpModel, String url, JSONObject jsonObject) {
getPostHttpUtils(context,httpModel,url,jsonObject);
}
@Override
public void sendFromHttp(Context context,HttpModel httpModel, String url, Map<String,String> map) {
getPostFromHttpUtils(context,httpModel,url,map);
}
private class MyStringCallback extends StringCallback
{
@Override
public void onBefore(Request request, int id)
{

}

@Override
public void onAfter(int id)
{

}

@Override
public void onError(Call call, Exception e, int id)
{
e.printStackTrace();
}

@Override
public void onResponse(String response, int id)
{
httpModel.onResult(response);

}

@Override
public void inProgress(float progress, long total, int id)
{
Log.e("TSGGER", "inProgress:" + progress);
}
}
private void getPostHttpUtils(Context context,HttpModel httpModel,String url,JSONObject jsonObject){
this.httpModel=httpModel;
this.context=context;
OkHttpUtils
.postString()
.url(url)
.mediaType(MediaType.parse("application/json; charset=utf-8"))
.addHeader("isupdate", "1")
.addHeader("version", "1.1.14")
.content(jsonObject.toString())
.build()
.execute(new MyStringCallback());

};
private void getPostFromHttpUtils(Context context,HttpModel httpModel,String url,Map<String,String> map){
this.httpModel=httpModel;
this.context=context;
OkHttpUtils
c6bd

.post()
.url(url)
.addHeader("isupdate", "1")
.addHeader("version", "1.1.14")
.params(map)
.build()
.execute(new MyStringCallback());

};

}

这两个类都是接口,定义了一个发送请求的接口和接收数据的接口用它与主Activity交互,如有不明白接口回调的请自行百度一下,这里我就不过多讲解了


package com.example.administrator.myproject;

import android.content.Context;

import org.json.JSONObject;

import java.util.Map;

/**
* Created by LiuYX on 2017/12/1/001.
*/

public interface HttpSendModel {
void sendHttp(Context context, HttpModel httpModel, String url, JSONObject jsonObject);
void sendFromHttp(Context context, HttpModel httpModel, String url, Map<String,String> map);
}

package com.example.administrator.myproject;

import org.json.JSONObject;

/**
* Created by LiuYX on 2017/12/1/001.
*/

public interface HttpModel {
void onResult(String str);
}


还有一步就是在Applaction设置一下,OKHttp的配置

ClearableCookieJar cookieJar1 = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(getApplicationContext()));
//        File cacheFile = new File(context.getExternalCacheDir(), "KairuCache");//缓存路径
//        Cache cache = new Cache(cacheFile, 1024 * 1024 * 40);//设置缓存大小为40M
HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);

//        CookieJarImpl cookieJar1 = new CookieJarImpl(new MemoryCookieStore());
OkHttpClient okHttpClient = new OkHttpClient.Builder()
//                .cache(cache)
.connectTimeout(10000L, TimeUnit.MILLISECONDS)
.readTimeout(10000L, TimeUnit.MILLISECONDS)
.addInterceptor(new LoggerInterceptor("TAG"))
.cookieJar(cookieJar1)
.hostnameVerifier(new HostnameVerifier()
{
@Override
public boolean verify(String hostname, SSLSession session)
{
return true;
}
})
.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
.build();
OkHttpUtils.initClient(okHttpClient);


最后就是怎么使用请求了

package com.example.administrator.myproject;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends BaseActivity {
String  ss="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.myTxt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
postJson();
}
});
findViewById(R.id.myFrom).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
postFrom();
}
});

}
public void postJson()
{
final JSONObject jsonObject=new JSONObject();
try {
jsonObject.put("id", "");
} catch (JSONException e) {
e.printStackTrace();
}
new HttpUtils().sendHttp(this,new HttpModel() {
@Override
public void onResult(String str) {
Toast.makeText(MainActivity.this,"请求成功"+str,Toast.LENGTH_SHORT).show();
}
},BaseContants.MM_USERBASE, jsonObject);

}
public void postFrom()
{
Map<String,String> map=new HashMap<>();
map.put("id", "");
new HttpUtils().sendFromHttp(this,new HttpModel() {
@Override
public void onResult(String str) {
Toast.makeText(MainActivity.this,"请求成功"+str,Toast.LENGTH_SHORT).show();
}
},BaseContants.MM_USERBASEFROM, map);

}

}

封装了表单请求,和Json请求这两种主流请求方式,如需其它请求方式,请按照我的方法自行封装,是不是比之前一大串代码简单多了呢


最后附上项目下载地址   http://download.csdn.net/download/qq_33407981/10143900 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息