很多人对于现在的网络请求需求都非常不一样,下面我给大家介绍一种网络请求的一种方式:OKHttp+ RxJava
OKHttp本身就是用来请求网络数据的,前面封装的OK处理异步用的是Handler对象,这篇文章就是将Handler替换成了最近使用的一种处理异步的框架RxJava
RxJava的依赖:
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
OKHttp的依赖:
解析数据使用的gson依赖:
compile 'com.google.code.gson:gson:2.2.4'
2.添加权限
MainActivity的xml文件:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private TextView tv;
private String url = "http://120.27.23.105/product/getCarts?uid=106";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.textview);
OkHttpUntils.getOkHttpUntils(this).get(url, BaseBean.class, new NetClickListener() {
@Override
public void Suesses(BaseBean baseBean) {
if(baseBean.getCode().equals("0")){
tv.setText(baseBean.getMsg());
}
}
@Override
public void Error(String msg) {
Toast.makeText(MainActivity.this, msg,Toast.LENGTH_SHORT).show();
}
});
}
}
import android.content.Context;
import com.google.gson.Gson;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class OkHttpUntils {
private Context context ;
private static OkHttpUntils okHttpUntils ;
private OkHttpUntils(Context context){
this.context = context ;
}
public static OkHttpUntils getOkHttpUntils(Context context){
if(okHttpUntils==null){
synchronized (OkHttpUntils.class){
if(okHttpUntils==null){
okHttpUntils = new OkHttpUntils(context);
}
}
}
return okHttpUntils;
}
public void get(String url, final Class clazz, final NetClickListener netClickListener){
Request request = new Request.Builder()
.get()
.url(url)
.build();
OkHttpClient.Builder okbuild = new OkHttpClient.Builder();
okbuild.addInterceptor(new LogInterceptor())
.build()
.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if(netClickListener!=null){
netClickListener.Error(e.getMessage().toString());
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String string = response.body().string();
Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super BaseBean> subscriber) {
Gson gson = new Gson();
BaseBean o = (BaseBean) gson.fromJson(string, clazz);
if(o!=null){
subscriber.onNext(o);
subscriber.onCompleted();
}else {
subscriber.onError(new NullPointerException("请求数据为空"));
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if(netClickListener!=null){
netClickListener.Error(e.getMessage().toString());
}
}
@Override
public void onNext(BaseBean baseBean) {
if(netClickListener!=null){
if(baseBean.getCode().equals("0")){
netClickListener.Suesses(baseBean);
}
}
}
});
}
});
}
}
bean类:
public class BaseBean {
private String msg ;
private String code ;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
接口:
public interface NetClickListener {
void Suesses(BaseBean baseBean);
void Error(String msg);
}
打印拦截器:
import android.util.Log;
import java.io.IOException;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
public class LogInterceptor implements Interceptor {
public static String TAG = "LogInterceptor";
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
long startTime = System.currentTimeMillis();
Response response = chain.proceed(chain.request());
long endTime = System.currentTimeMillis();
long duration=endTime-startTime;
MediaType mediaType = response.body().contentType();
String content = response.body().string();
Log.d(TAG,"\n");
Log.d(TAG,"----------Start----------------");
Log.d(TAG, "| "+request.toString());
String method=request.method();
if("POST".equals(method)){
StringBuilder sb = new StringBuilder();
if (request.body() instanceof FormBody) {
FormBody body = (FormBody) request.body();
for (int i = 0; i < body.size(); i++) {
sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");
}
sb.delete(sb.length() - 1, sb.length());
Log.d(TAG, "| RequestParams:{"+sb.toString()+"}");
}
}
Log.d(TAG, "| Response:" + content);
Log.d(TAG,"----------End:"+duration+"毫秒----------");
return response.newBuilder()
.body(ResponseBody.create(mediaType, content))
.build();
}
}
效果:
效果已经呈现,就先写到这里,感觉有用的可以拿去参考,谢谢大家支持!!!