第1步 在build.gradle中引入
// Retrofit库
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
// Okhttp库
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
(网络权限: <uses-permission android:name="android.permission.INTERNET"/>)
第2步 初始化和Base创建
2.1 LogInterceptor
import android.util.Log; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.MediaType; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; import okio.Buffer; public class LogInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Log.e("info", String.format("%1$s->%2$s", request.method(), request.url())); if (request.headers() != null) { Log.e("info", "Headers:" + request.headers()); } if (request.body() != null) { Log.e("info", "RequestBody:" + bodyToString(request.body())); } Response response = chain.proceed(chain.request()); MediaType mediaType = response.body().contentType(); String responseBody = response.body().string(); Log.e("info", "ResponseBody:" + responseBody); return response.newBuilder().body(ResponseBody.create(mediaType, responseBody)).build(); } private String bodyToString(final RequestBody request) { if (request != null) { try { final RequestBody copy = request; final Buffer buffer = new Buffer(); copy.writeTo(buffer); return buffer.readUtf8(); } catch (final IOException e) { Log.e("info", "Did not work."); } } return null; } }
2.2 ApiManager:
import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class ApiManager { private OkHttpClient mOkHttpClient; private static String mBaseUrl = "http://www.gwadarpro.com"; private static int mTimeout = 20; private static ApiManager mInstance = new ApiManager(); private Retrofit mRetrofit; public static ApiManager getInstance() { return mInstance; } private ApiManager() { } public <T> T getApiService(Class<T> service) { return getRetrofit().create(service); } private Retrofit getRetrofit() { if (mRetrofit == null) { mRetrofit = new Retrofit.Builder() .baseUrl(mBaseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(getOkHttpClient()) .build(); } return mRetrofit; } private OkHttpClient getOkHttpClient() { if (mOkHttpClient == null) { mOkHttpClient = new OkHttpClient.Builder() .connectTimeout(mTimeout, TimeUnit.SECONDS) .readTimeout(mTimeout, TimeUnit.SECONDS) .writeTimeout(mTimeout, TimeUnit.SECONDS) .retryOnConnectionFailure(true) .addInterceptor(new LogInterceptor()) .build(); } return mOkHttpClient; } }
2.3 ApiService(定义接口地址、参数):
import com.jlncjf.retrofit2demo.model.LoginBean; import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; public interface ApiService { /** * 登录 * * @param username 用户名 * @param password 密码 * @param type 登录类型 * @param google_token 谷歌推送token * @return */ @FormUrlEncoded @POST("/mobile/index.php?act=login&op=index") Observable<LoginBean> login(@Field("username") String username, @Field("password") String password, @Field("type") String type, @Field("google_token") String google_token); }
2.4 ApiObserver
import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; public class ApiObserver<T> implements Observer<T> { private final ApiCallback<T> mCallback; public ApiObserver(ApiCallback<T> callback) { this.mCallback = callback; } @Override public void onSubscribe(@NonNull Disposable d) { } @Override public void onError(Throwable e) { if (mCallback != null) { mCallback.onError(e); } } @Override public void onNext(T t) { if (mCallback != null) { mCallback.onNext(t); } } @Override public void onComplete() { if (mCallback != null) { mCallback.onCompleted(); } } public static <T> ApiObserver<T> getApiObserver(ApiCallback<T> callback) { return new ApiObserver<>(callback); } public static <T> void subscribe(Observable<T> observable, SimpleCallback<T> callback) { observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getApiObserver(callback)); } }
2.5 ApiCallback:
public interface ApiCallback<T> { void onNext(T t); void onError(Throwable e); void onCompleted(); }
2.5 SimpleCallback
import com.jlncjf.retrofit2demo.mvp.View.BaseView; public abstract class SimpleCallback<T> implements ApiCallback<T> { private BaseView mView; public SimpleCallback(BaseView mView){ this.mView = mView; } @Override public void onError(Throwable e) { mView.onError(e); } @Override public void onCompleted() { mView.onCompleted(); } }
2.6 BaseBean(网络请求返回):
public class BaseBean { private int errCode; private String errMess; public int getErrCode() { return errCode; } public void setErrCode(int errCode) { this.errCode = errCode; } public String getErrMess() { return errMess; } public void setErrMess(String errMess) { this.errMess = errMess; } }
2.7 BaseView:
public interface BaseView { void onError(Throwable e); void onCompleted(); }
2.8 IPresenter
import com.jlncjf.retrofit2demo.mvp.View.BaseView; public interface IPresenter<T extends BaseView> { void attachView(T view); void detachView(); }
2.9 BasePresenter:
import com.jlncjf.retrofit2demo.mvp.View.BaseView; public class BasePresenter<T extends BaseView> implements IPresenter<T> { protected T mView; @Override public void attachView(T view) { mView = view; } @Override public void detachView() { mView = null; } }
2.10 BaseActivity:
import android.os.Bundle; import android.support.annotation.LayoutRes; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import com.jlncjf.retrofit2demo.mvp.Presenter.BasePresenter; import com.jlncjf.retrofit2demo.mvp.View.BaseView; public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView { protected T mPresenter; protected BaseActivity mContext; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; setContentView(getRootViewId()); initPresenter(); if (mPresenter != null) { mPresenter.attachView(this); } initView(); initData(); } public abstract @LayoutRes int getRootViewId(); public abstract void initView(); public abstract void initPresenter(); public abstract void initData(); @Override protected void onDestroy() { super.onDestroy(); if (mPresenter != null) { mPresenter.detachView(); } } }
2.11 Api
import com.jlncjf.retrofit2demo.model.LoginBean; public class Api { private static ApiService apiService; private Api() { throw new AssertionError(); } private static ApiService getApiService() { if (apiService == null) { apiService = ApiManager.getInstance().getApiService(ApiService.class); } return apiService; } public static void login(String username, String password, String type, String google_token, SimpleCallback<LoginBean> callback) { ApiObserver.subscribe(getApiService().login(username, password, type, google_token), callback); } }
3、具体实现
3.1 LoginBean(登录返回对应的实体类)
public class LoginBean extends BaseBean{ private DataBean data; public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public static class DataBean { private String nickname; public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } } }
3.2 ILoginView(定义View中需要的接口,比如拿到数据以后)
import com.jlncjf.retrofit2demo.model.LoginBean; public interface ILoginView extends BaseView { void onLoginData(LoginBean bean); }
3.3 LoginPresenter
import com.jlncjf.retrofit2demo.Api; import com.jlncjf.retrofit2demo.mvp.View.ILoginView; import com.jlncjf.retrofit2demo.SimpleCallback; import com.jlncjf.retrofit2demo.mvp.model.LoginBean; public class LoginPresenter extends BasePresenter<ILoginView> { public void login(String username, String password, String type, String google_token) { Api.login(username, password, type, google_token, new SimpleCallback<LoginBean>(mView) { @Override public void onNext(LoginBean bean) { mView.onLoginData(bean); } }); } }
3.4 LoginActivity
import android.widget.TextView; import com.jlncjf.retrofit2demo.mvp.Presenter.LoginPresenter; import com.jlncjf.retrofit2demo.mvp.View.ILoginView; import com.jlncjf.retrofit2demo.mvp.model.LoginBean; public class LoginActivity extends BaseActivity<LoginPresenter> implements ILoginView { private static final String TAG = "LoginActivity"; private TextView tv_result; @Override public int getRootViewId() { return R.layout.activity_main; } @Override public void initView() { tv_result = findViewById(R.id.tv_result); } @Override public void initPresenter() { mPresenter = new LoginPresenter(); } @Override public void initData() { mPresenter.login("wangjinqiang", "qq", "0", "token"); } @Override public void onLoginData(LoginBean bean) {//根据登录返回的状态码做相应处理 if (bean.getErrCode() == 200) { tv_result.setText(bean.getData().getNickname()); } else { tv_result.setText("errCode:" + String.valueOf(bean.getErrCode())); } } @Override public void onError(Throwable e) { tv_result.setText(e.getMessage()); e.printStackTrace(); } @Override public void onCompleted() { } }