package com.example.lx_0702view1lx;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.lyz.sunzuihou.MyAppLation;
import com.lyz.sunzuihou.bean.FirstBean;
import com.lyz.sunzuihou.bean.LoginBean;
import com.lyz.sunzuihou.bean.SecondBean;
import com.lyz.sunzuihou.url.MyRequest;
import com.lyz.sunzuihou.url.MyUrl;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
public class OkHttp {
private final OkHttpClient okHttpClient;
private final MyRequest myRequest;
public OkHttp() {
HttpLoggingInterceptor httpLoggingInterceptor=new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
SharedPreferences login_info = MyAppLation.context.getSharedPreferences("login_info", Context.MODE_PRIVATE);
String userId = login_info.getString("userId", null);
String sessionId = login_info.getString("sessionId", null);
if(TextUtils.isEmpty(userId)|| TextUtils.isEmpty(sessionId)){
return chain.proceed(chain.request());
}else{
Request build = chain.request().newBuilder().addHeader("userId", userId).addHeader("sessionId", sessionId)
.build();
return chain.proceed(build);
}
}
}).build();
Retrofit retrofit=new Retrofit.Builder().baseUrl(MyUrl.BASE)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
myRequest = retrofit.create(MyRequest.class);
}
public void getInfo(String url, Map<String,String> map, final MyCallBack myCallBack){
if(map==null){
myRequest.getinfo(url)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(new Subscriber<ResponseBody>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
myCallBack.onError(e.getMessage());
}
@Override
public void onNext(ResponseBody responseBody) {
try {
myCallBack.onSuccess(responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
});
}else{
myRequest.getInfo(url, map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<ResponseBody>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
myCallBack.onError(e.getMessage());
}
@Override
public void onNext(ResponseBody responseBody) {
try {
myCallBack.onSuccess(responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
private static class Holder{
public static OkHttp okHttp=new OkHttp();
}
public static OkHttp getInstance(){
return Holder.okHttp;
}
Observable<ResponseBody> info1,info2,info3;
public void getShow(final MyCallBack myCallBack){
final Gson gson=new Gson();
final Map<String,String> map=new HashMap<>();
map.put("phone","17600633745");
map.put("pwd","123456");
myRequest.postInfo(MyUrl.Login,map)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.doOnNext(new Action1<ResponseBody>() {
private Observable<ResponseBody> getinfo;
@Override
public void call(ResponseBody responseBody) {
String string="";
try {
string= responseBody.string();
} catch (IOException e) {
e.printStackTrace();
}
LoginBean loginBean = gson.fromJson(string, LoginBean.class);
int userId = loginBean.getResult().getUserId();
String sessionId = loginBean.getResult().getSessionId();
SharedPreferences login_info = MyAppLation.context.getSharedPreferences("login_info", Context.MODE_PRIVATE);
SharedPreferences.Editor editor=login_info.edit();
editor.putString("userId",userId+"");
editor.putString("sessionId",sessionId);
editor.commit();
info1= myRequest.getinfo(MyUrl.FIRST);
}
}).flatMap(new Func1<ResponseBody, Observable<ResponseBody>>(){
@Override
public Observable<ResponseBody> call(ResponseBody responseBody) {
return info1;
}
}).doOnNext(new Action1<ResponseBody>() {
@Override
public void call(ResponseBody responseBody) {
String string="";
try {
string= responseBody.string();
} catch (IOException e) {
e.printStackTrace();
}
FirstBean firstBean = gson.fromJson(string, FirstBean.class);
String id = firstBean.getResult().get(0).getId();
Map<String,String> map1=new HashMap<>();
map1.put("firstCategoryId",id+"");
info2=myRequest.getInfo(MyUrl.SECOND,map1);
}
}).flatMap(new Func1<ResponseBody, Observable<ResponseBody>>() {
@Override
public Observable<ResponseBody> call(ResponseBody responseBody) {
return info2;
}
}).doOnNext(new Action1<ResponseBody>() {
@Override
public void call(ResponseBody responseBody) {
String string="";
try {
string=responseBody.string();
} catch (IOException e) {
e.printStackTrace();
}
SecondBean secondBean = gson.fromJson(string, SecondBean.class);
String id = secondBean.getResult().get(0).getId();
Map<String,String> map1=new HashMap<>();
map1.put("categoryId",id+"");
map1.put("page",1+"");
map1.put("count",10+"");
info3=myRequest.getInfo(MyUrl.THIRD,map1);
}
}).flatMap(new Func1<ResponseBody, Observable<ResponseBody>>() {
@Override
public Observable<ResponseBody> call(ResponseBody responseBody) {
return info3;
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<ResponseBody>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
myCallBack.onError(e.getMessage());
}
@Override
public void onNext(ResponseBody responseBody) {
try {
myCallBack.onSuccess(responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
public interface MyCallBack{
void onSuccess(String json);
void onError(String json);
}
}