第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() {
}
}
Demo下载地址:https://download.csdn.net/download/u012954039/10615514