Rxjava2+retrofit2之Android网络请求(模拟api接口)

开发app使用网络请求有很多库可以选择,在使用rxjava的情况下,有一套非常好且流行的库
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; }
}

猜你喜欢

转载自blog.csdn.net/robert_cysy/article/details/79258272