开发app使用网络请求有很多库可以选择,在使用rxjava的情况下,有一套非常好且流行的库
retrofit2 + rxjava2
同时在开发app的时候,app和后台api会同时启动开发,app在开发的时候还没有api接口可用,这时候可以用实现接口的模拟类,来模拟接口返回的内容。
简化方法:在/app/build.gradle里面加入如下内容:(defaultConfig的外面)
retrofit2 + rxjava2
同时在开发app的时候,app和后台api会同时启动开发,app在开发的时候还没有api接口可用,这时候可以用实现接口的模拟类,来模拟接口返回的内容。
一、在app/build.gradle里加入如下依赖:
//rxjava implementation "io.reactivex.rxjava2:rxjava:2.1.3" implementation "io.reactivex.rxjava2:rxandroid:2.0.1" //retrofit compile 'com.squareup.retrofit2:retrofit:2.2.0' compile 'com.squareup.retrofit2:converter-gson:2.2.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
二、定义接口:
为了工程之后修改容易,同时,涉及到网络api和模拟api类。所以要定义接口:
为了简单明了,这里只举例一个登陆的方法。(看完下面代码会发现,整体代码简洁明了,并不复杂)
接口定义如下:
public interface ApiSource { Flowable<Login> login(String phoneNumber); }
三、使用代码调用
1.全局注入类,用来选择使用那个实现类
public class Injection { public static ApiSource getApiSource() { //在这里切换使用那种方式处理网络api请求 return RemoteApiSource.getInstance();//真正的网络api请求 //return FakeLocalApiSource.getInstance();//模拟类实现 } }2.login函数使用了lambda简化了表达式进一步简化代码:
简化方法:在/app/build.gradle里面加入如下内容:(defaultConfig的外面)
compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }3.调用函数:
private void login(String phoneNumhber) { mApiSource = Injection.getApiService(); mCompositeDisposable.clear(); Disposable disposable = mApiSource.login(phoneNumber) .subscribeOn(mSchedulerProvider.io()) .observeOn(mSchedulerProvider.ui()) .subscribe(login -> { int status = login.getStatus(); String userId = login.getResult();//uid }, throwable -> { throwable.printStackTrace(); } ); mCompositeDisposable.add(disposable); }
四、模拟api类定义
public class FakeLocalApiSource implements ApiSource { private static FakeLocalApiSource INSTANCE; private static final int SERVICE_LATENCY_IN_MILLIS = 500; public static final String FAKE_UID = "999999"; private FakeLocalApiSource() { } public static FakeLocalApiSource getInstance() { if (INSTANCE == null) { INSTANCE = new FakeLocalApiSource(); } return INSTANCE; } @Override public Flowable<Login> login(String phoneNumber) { Login login = new Login(); login.setStatus(1); login.setResult(FAKE_UID); return Flowable.just(login).delay(SERVICE_LATENCY_IN_MILLIS, TimeUnit.MILLISECONDS); } }
五、网络api的实现:
public class RemoteApiSource implements ApiSource { private static final String TAG = "RemoteApiSource"; private static RemoteApiSource INSTANCE; private String mUid = null; private RemoteApiSource() { } public static RemoteApiSource getInstance() { if (INSTANCE == null) { INSTANCE = new RemoteApiSource(); } return INSTANCE; } @Override public Flowable<Login> login(String phoneNumber) { Flowable<Login> res = HttpMethods.getInstance().getApiService().login(phoneNumber); return res; } }
六、网络api实现的retrofit2代码:
public class HttpMethods { private static final String BASE_URL = Contants.BASE_URL; private static final int TIME_OUT=4; private final ApiService apiService; private HttpMethods() { Retrofit retrofit; OkHttpClient client = new OkHttpClient(); client.newBuilder().connectTimeout(TIME_OUT, TimeUnit.SECONDS); retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); apiService = retrofit.create(ApiService.class); } private static class sinalInstance { public static final HttpMethods instance = new HttpMethods(); } public static HttpMethods getInstance(){ return sinalInstance.instance; } public ApiService getApiService() { return apiService; } } public interface ApiService { //help url //http://blog.csdn.net/androidxiaogang/article/details/53328217 @GET("/line/user/login") Flowable<Login> login(@Query("mobile") String phoneNumber); } //公用代码类,注意:使用代码混淆的时候,一下类不能被混淆 public class Login { private int status; private String result; private String extra; public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } public String getExtra() { return extra; } public void setExtra(String extra) { this.extra = extra; } }