Retrofit和RXjava

MyCallBack

package com.example.a51044.app55.callback;

public interface MyCallBack<T> {
    void onSuccess(T data);
    void onFail(T error);
}

View层

package com.example.a51044.app55.ivew;

public interface IVew<T> {
    void Success(T data);
    void Error(T error);
}

Model层

package com.example.a51044.app55.model;

import com.example.a51044.app55.callback.MyCallBack;

import java.util.Map;

public interface Model {
    void start(String url, Map<String,String>map, Class clazz, MyCallBack callBack);
}

Model实现类

package com.example.a51044.app55.model;

import com.example.a51044.app55.callback.MyCallBack;
import com.example.a51044.app55.network.RetrofitUtils;
import com.google.gson.Gson;

import java.util.Map;

public class ModelImpl implements Model {
    @Override
    public void start(String url, Map<String, String> map, final Class clazz, final MyCallBack callBack) {
        RetrofitUtils.getInstance().post(url,map).setHttpListtener(new RetrofitUtils.HttpListtener() {
            @Override
            public void OnSuccess(String jsonStr) {
                Gson gson=new Gson();
                Object o = gson.fromJson(jsonStr, clazz);
                callBack.onSuccess(o);
            }

            @Override
            public void OnError(String error) {
                callBack.onFail(error);
            }
        });
    }
}

MyApiService接口:

package com.example.a51044.app55.network;

import java.util.Map;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;

public interface MyApiService {

//第一个url是请求的接口域名,第二个是请求的参数,《ResponeseBody》是响应体,可以是T,可以是基本类
    @GET
    rx.Observable<ResponseBody> get(@Url String url, @QueryMap Map<String,String>map);

    @POST
    rx.Observable<ResponseBody>post(@Url String url,@QueryMap Map<String,String>map);

    @GET
    Call<ResponseBody>get();
}

工具类:

package com.example.a51044.app55.network;


import com.example.a51044.app55.Contacts;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observer;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.observers.SafeSubscriber;
import rx.schedulers.Schedulers;


public class RetrofitUtils {

    private MyApiService myApiService;


    private RetrofitUtils() {
    //日志拦截器
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        //设置日志拦截器的等级
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
        //设置读超时
                .readTimeout(20, TimeUnit.SECONDS)
                .connectTimeout(20, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .addInterceptor(loggingInterceptor)
                //当网络请求失败的时候,等到网络正常自动加载
                .retryOnConnectionFailure(true)
                .build();

        Retrofit retrofit = new Retrofit.Builder()
        	//添加Gson
                .addConverterFactory(GsonConverterFactory.create())
                //添加RxJava
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                //添加地址域名
                .baseUrl(Contacts.BASE_URL)
                //添加OkHttp
                .client(okHttpClient)
                .build();

//创建完retrofit,就可以调用myApiService里的方法了
        myApiService = retrofit.create(MyApiService.class);
    }


//静态内部类
    public static RetrofitUtils getInstance()
    {
        return RetroHolder.retro;
    }

    private static class RetroHolder
    {
        private static final RetrofitUtils retro=new RetrofitUtils();
    }

//get请求方式
    public RetrofitUtils get(String url, Map<String,String>map)
    {
    //请求网络放在子线程
        myApiService.get(url,map).subscribeOn(Schedulers.io())
        //成功后回调到主线程(observeOn)是观察者
                .observeOn(AndroidSchedulers.mainThread())
                //订阅
                .subscribe(observer);
                //返回本类对象
        return RetrofitUtils.getInstance();
    }

    public RetrofitUtils post(String url,Map<String,String>map)
    {
        if(map==null)
        {
            map=new HashMap<>();
        }
        myApiService.post(url,map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
        return RetrofitUtils.getInstance();
    }

    private Subscriber<ResponseBody>subscriber=new Subscriber<ResponseBody>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(ResponseBody responseBody) {

        }
    };


    public Observer observer=new Observer<ResponseBody>() {
    //关闭
        @Override
        public void onCompleted() {

        }

//失败
        @Override
        public void onError(Throwable e) {
            if(httpListtener!=null)
            {
                httpListtener.OnError(e.getMessage());
            }
        }

//成功
        @Override
        public void onNext(ResponseBody responseBody) {
            if(httpListtener!=null)
            {
                try {
                    httpListtener.OnSuccess(responseBody.string());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };


//自定义接口
    public interface HttpListtener
    {
        void OnSuccess(String jsonStr);

        void OnError(String error);
    }

    private HttpListtener httpListtener;

    public void setHttpListtener(HttpListtener listtener)
    {
        this.httpListtener=listtener;
    }

}

P层接口:

package com.example.a51044.app55.presenter;

import java.util.Map;

public interface Presenter {
    void start(String url, Map<String,String>map,Class clazz);
}

P层实现类:

package com.example.a51044.app55.presenter;

import com.example.a51044.app55.callback.MyCallBack;
import com.example.a51044.app55.ivew.IVew;
import com.example.a51044.app55.model.ModelImpl;

import java.util.Map;

public class PresenterImpl implements Presenter {
    private IVew iVew;
    private ModelImpl model;

    public PresenterImpl(IVew iVew) {
        this.iVew = iVew;
        model=new ModelImpl();
    }

    @Override
    public void start(String url, Map<String, String> map, Class clazz) {
        model.start(url, map, clazz, new MyCallBack() {
            @Override
            public void onSuccess(Object data) {
                iVew.Success(data);
            }

            @Override
            public void onFail(Object error) {
                iVew.Error(error);
            }
        });
    }
}

存放接口的类:

package com.example.a51044.app55;

public class Contacts {
    public static final String BASE_URL="http://www.zhaoapi.cn/";
    public static final String USER_LOGIN="user/login";
    public static final String USER_INFO="user/getUserInfo";
    public static final String UP_LOAD_IMAGE="file/upload";
}

主页面的代码:

package com.example.a51044.app55;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.a51044.app55.bean.LoginBean;
import com.example.a51044.app55.bean.UserInfoBean;
import com.example.a51044.app55.ivew.IVew;
import com.example.a51044.app55.presenter.PresenterImpl;

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

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity<T> extends AppCompatActivity implements IVew<T> {

    @BindView(R.id.et_main_name)
    EditText etMainName;
    @BindView(R.id.et_main_pw)
    EditText etMainPw;
    @BindView(R.id.button_main_login)
    Button buttonMainLogin;
    @BindView(R.id.button_main_get_user_info)
    Button buttonMainGetUserInfo;

    private PresenterImpl presenter;
    private final int TYPE_LOGIN=0;
    private final int TYPE_UPLOAD_IMG=TYPE_LOGIN+1;
    private final int TYPE_GET_USER_INFO=TYPE_UPLOAD_IMG+1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        presenter=new PresenterImpl(this);
    }

    @OnClick({R.id.button_main_login,R.id.button_main_get_user_info})
    public void onViewClicked(View view)
    {
        switch (view.getId())
        {
            case R.id.button_main_login:
            
                checkPermission(TYPE_LOGIN);
                break;

            case R.id.button_main_get_user_info:
                checkPermission(TYPE_GET_USER_INFO);
                break;
        }
    }


    private void checkPermission(int type_login) {
    //判断版本号
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M)
        {
//检查版本号,是否成功开启网络权限           if(ContextCompat.checkSelfPermission(this,Manifest.permission.INTERNET)!=PackageManager.PERMISSION_GRANTED)
           {
           //发送开启网络权限的请求
               ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.INTERNET},type_login);
           }
           else
           {
           //请求网络
               startRequest(type_login);
           }
        }
        else
        {
            startRequest(type_login);
        }
    }

    private void startRequest(int type)
    {
        switch (type)
        {
            case TYPE_LOGIN:
                Map<String,String>map=new HashMap<>();
                map.put("mobile",etMainName.getText().toString().trim());
                map.put("password",etMainPw.getText().toString().trim());
                presenter.start(Contacts.USER_LOGIN,map,LoginBean.class);
                break;
            case TYPE_GET_USER_INFO:
                Map<String,String>map1=new HashMap<>();
                map1.put("uid","23489");
                presenter.start(Contacts.USER_INFO,map1,UserInfoBean.class);
                break;
        }
    }

    @Override
    public void Success(T data) {
        if(data instanceof LoginBean)
        {
            Toast.makeText(this, ((LoginBean) data).getMsg(), Toast.LENGTH_SHORT).show();
        }
        else if (data instanceof UserInfoBean)
        {
            UserInfoBean userInfoBean= (UserInfoBean) data;
            Toast.makeText(this, userInfoBean.getMsg(), Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void Error(T error) {

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //权限的回调方法,判断是否开启权限,如果用户点击开启,就动态开启权限
        if(grantResults[0]==PackageManager.PERMISSION_GRANTED)
        {
            startRequest(requestCode);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43747497/article/details/85321074