笔记

192 阅读2分钟

先从网络请求说起

现在设备上的数据都是存在后端,移动端要跟后端去拿数据,就只能通过网络

要通过什么方式来请求网络呢?

后端提供数据的方式就是暴露一个接口(API),实际上就是一个链接,app端就是要去访问后端的接口,去获取到相应的数据,后端则会返回数据,目前用的一般是(json)

image.png

那么,Android要去进行网络请求,肯定就要用到一些网络请求的类去做,最基本的做法是java有一个叫HttpUrlConnection

但是目前很多主流的框架可以去解决这个网络请求的一些操作,方便使用,如(OkHttp,Retrofit(基于OkHttp))

就可以通过Retrofit去访问一些接口,然后通过返回来的json数据解析,并渲染到View上面,就能显示

整体的思路就是 APP通过网络框架请请求接口,然后接口返回相应的数据并取回来解析之后显示到界面

再来说一说MVP模式

M表示Model(数据模型层),V表示View(视图层),P表示presenter(可以理解为中介)

V层需要显示什么数据,则去找P层,具体数据从哪来,就是P层去找M层

在Android中,一段网络请求的模式,Activity相当于V层,中间有个P层,网络请求的逻辑一般在M层

image.png

以下这个地方就是V层去找P层调用登录的方法

private void subscribeLoginClickEvent() {
    mPresenter.addRxBindingSubscribe(RxView.clicks(mLoginBtn)
            .throttleFirst(Constants.CLICK_TIME_AREA, TimeUnit.MILLISECONDS)
            .filter(o -> mPresenter != null)
            .subscribe(o -> mPresenter.getLoginData(
                    mAccountEdit.getText().toString().trim(),
                    mPasswordEdit.getText().toString().trim())));
}

image.png

以下就是P层去找M层调用登录的放法

@Override
public void getLoginData(String username, String password) {
    if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
        mView.showSnackBar(WanAndroidApp.getInstance().getString(R.string.account_password_null_tint));
        return;
    }
    addSubscribe(mDataManager.getLoginData(username, password)
            .compose(RxUtils.rxSchedulerHelper())
            .compose(RxUtils.handleResult())
            .subscribeWith(new BaseObserver<LoginData>(mView,
                    WanAndroidApp.getInstance().getString(R.string.login_fail)) {
                @Override
                public void onNext(LoginData loginData) {
                    setLoginAccount(loginData.getUsername());
                    setLoginPassword(loginData.getPassword());
                    setLoginStatus(true);
                    RxBus.getDefault().post(new LoginEvent(true));
                    mView.showLoginSuccess();
                }
            }));
}

image.png