开发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; }
}
本文介绍了如何在Android应用中使用Rxjava2和retrofit2进行网络请求。首先,在app/build.gradle中添加依赖,接着定义接口,包括网络接口和模拟接口。然后展示如何在代码中调用这些接口,同时提供了模拟API类的定义,以及使用retrofit2实现网络API的具体代码。
742

被折叠的 条评论
为什么被折叠?



