//效果图 //Rxjava+ok+Retrofit2.0依赖 implementation 'io.reactivex:rxjava:1.1.0' implementation 'io.reactivex:rxandroid:1.1.0' implementation'com.squareup.retrofit2:adapter-rxjava:2.0.2 implementation 'com.squareup.okhttp3:okhttp:3.4.1' implementation 'com.squareup.retrofit2:retrofit:2.1.0'
//ApiService
package com.example.utils;
import com.example.pojo.GoodsBean;
import retrofit2.http.GET;
import rx.Observable;
public interface GoodsApi {
@GET("ad/getAd")
/*Call<GoodsBean> rxGoods();*/
Observable<GoodsBean> rxGoods();
}
//Rtrofit工具类
package com.example.utils;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Retofit网络请求工具类
* Created by HDL on 2016/7/29.
*/
public class RetrofitUtils {
private static final int READ_TIMEOUT = 60;//读取超时时间,单位 秒
private static final int CONN_TIMEOUT = 12;//连接超时时间,单位 秒
private static Retrofit mRetrofit;
private RetrofitUtils() {
}
public static Retrofit newInstence(String url) {
mRetrofit = null;
OkHttpClient client = new OkHttpClient();//初始化一个client,不然retrofit会自己默认添加一个
client.newBuilder()
.readTimeout(READ_TIMEOUT, TimeUnit.MINUTES)//设置读取时间为一分钟
.connectTimeout(CONN_TIMEOUT, TimeUnit.SECONDS);//设置连接时间为12s
mRetrofit = new Retrofit.Builder()
.client(client)//添加一个client,不然retrofit会自己默认添加一个
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return mRetrofit;
}
}
//View层
package com.example.mvp.goods_contract; import com.example.pojo.GoodsBean; import com.example.utils.OnHttpCallBack; import java.util.List; public interface Goods_Contract { interface Model { void setUrl(String base, String mulu , GetDataState getDataState); } interface GetDataState{ void onSuccess(List<GoodsBean.TuijianBean.ListBean> list); void onFaild(String errorMsg);//失败了就调用这个方法,可以传递错误的请求消息给调用者 } interface View { void onSuccess(List<GoodsBean.TuijianBean.ListBean> list); void onFaild(String errorMsg);//失败了就调用这个方法,可以传递错误的请求消息给调用者 } interface Presenter { void setUrl(String base,String mulu); } }
//Presenter层
package com.example.mvp.goods_presenter;
import com.example.mvp.goods_contract.Goods_Contract;
import com.example.mvp.goods_model.Goods_Model;
import com.example.pojo.GoodsBean;
import java.util.List;
public class Goods_Presenter implements Goods_Contract.Presenter, Goods_Contract.GetDataState {
private Goods_Contract.View view;
private Goods_Contract.Model model;
public Goods_Presenter(Goods_Contract.View view) {
this.view = view;
model = new Goods_Model();
}
@Override
public void setUrl(String base, String mulu) {
model.setUrl(base,mulu,this);
}
@Override
public void onSuccess(List<GoodsBean.TuijianBean.ListBean> list) {
view.onSuccess(list);
}
@Override
public void onFaild(String errorMsg) {
view.onFaild(errorMsg);
}
}
//Model层
package com.example.mvp.goods_model; import com.example.mvp.goods_contract.Goods_Contract; import com.example.pojo.GoodsBean; import com.example.utils.GoodsApi; import com.example.utils.RetrofitUtils; import com.socks.library.KLog; import java.net.ConnectException; import java.net.SocketTimeoutException; import retrofit2.adapter.rxjava.HttpException; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class Goods_Model implements Goods_Contract.Model { @Override public void setUrl(String url, String mulu, final Goods_Contract.GetDataState callBack) { //登录的网络请求 RetrofitUtils.newInstence(url)//实例化Retrofit对象 .create(GoodsApi.class)//创建Rxjava---->LoginService对象 .rxGoods() .subscribeOn(Schedulers.newThread())//在新线程中执行登录请求 .observeOn(AndroidSchedulers.mainThread())//在主线程中执行 .subscribe(new Subscriber<GoodsBean>() {//网络(登录)请求回调 @Override public void onCompleted() { //完成的时候调用 } @Override public void onError(Throwable e) { KLog.e(e.getMessage() + "--"); e.printStackTrace(); //失败的时候调用-----一下可以忽略 直接 callBack.onFaild("请求失败"); if (e instanceof HttpException) { HttpException httpException = (HttpException) e; //httpException.response().errorBody().string() int code = httpException.code(); if (code == 500 || code == 404) { callBack.onFaild("服务器出错"); } } else if (e instanceof ConnectException) { callBack.onFaild("网络断开,请打开网络!"); } else if (e instanceof SocketTimeoutException) { callBack.onFaild("网络连接超时!!"); } else { callBack.onFaild("发生未知错误" + e.getMessage()); KLog.e("Myloy", e.getMessage()); } } @Override public void onNext(GoodsBean goodsBean) { callBack.onSuccess(goodsBean.getTuijian().getList()); } }); } }