安卓MVP+RxJava以及数据的请求与缓存

原本的MVP模式在Presenter中调用Service请求网络数据。这里为了实现数据的缓存,加入Repository模块,Presenter不再直接调用Service请求数据,而是调用Repository获取数据。数据的来源逻辑在Repository中处理,Presenter不知道数据是从网络获取的还是从本地缓存获取的。

流程图

包结构如下


MVP基类

BaseMvpView.class:

public interface BaseMvpView {

    Context getContext();
}

BaseMvpPresenter.class:

public abstract class BaseMvpPresenter<T extends BaseMvpView> {

    private WeakReference<T> mViewWeakReference;

    public BaseMvpPresenter(T view) {
        mViewWeakReference = new WeakReference<>(view);
    }

    public T getView() {
        if (mViewWeakReference != null) {
            return mViewWeakReference.get();
        }
        return null;
    }

    public abstract void initData(Bundle bundle);

    public void release() {
        if (mViewWeakReference != null) {
            mViewWeakReference.clear();
            mViewWeakReference = null;
        }
    }
}

BaseMvpActivity.class:

public abstract class BaseMvpActivity<T extends BaseMvpPresenter> extends AppCompatActivity{

    public T mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mPresenter = initPresenter();
        mPresenter.initData(getIntent().getExtras());
    }

    public abstract T initPresenter();
}

NetworkBoundResource.class :

public abstract class NetworkBoundResource<T> {

    public abstract T getFromDb();

    public abstract boolean shouldFetchRemoteSource();

    public abstract T getRemoteSource();

    public abstract void saveRemoteSource(T remoteSource);

    public Observable<T> getAsObservable(){
        return Observable.create(new ObservableOnSubscribe<T>() {
            @Override
            public void subscribe(ObservableEmitter<T> e) throws Exception {
                T localData = getFromDb();
                if (localData != null) {
                    e.onNext(localData);
                }
                if (shouldFetchRemoteSource()) {
                    T remoteData = getRemoteSource();
                    if (remoteData != null) {
                        saveRemoteSource(remoteData);
                        e.onNext(remoteData);
                    }
                }
            }
        });
    }
}

TestRepository.class :

public class TestRepository {

    public static Observable<String> loadData() {

        return new NetworkBoundResource<String>() {

            @Override
            public String getFromDb() {
                return TestCache.getDataFromDb();
            }

            @Override
            public boolean shouldFetchRemoteSource() {
                return false;
            }

            @Override
            public String getRemoteSource() {
                return TestService.getData();
            }

            @Override
            public void saveRemoteSource(String remoteSource) {

            }
        }.getAsObservable();
    }
}

TestView.class :

public interface TestView extends BaseMvpView{

    void refreshUI(String result);
}

TestPresenter.class :

public class TestPresenter extends  BaseMvpPresenter<TestView>{

    public TestPresenter(TestView view) {
        super(view);
    }

    @Override
    public void initData(Bundle bundle) {
        loadData();
    }

    private void loadData() {
        TestRepository.loadData().subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                if (getView() != null) {
                    getView().refreshUI(s);
                }
            }
        });
    }
}

TestActivity.class :

public class TestActivity extends BaseMvpActivity<TestPresenter> implements TestView {

    @Override
    public TestPresenter initPresenter() {
        return new TestPresenter(this);
    }

    @Override
    public void refreshUI(String result) {
    }

    @Override
    public Context getContext() {
        return this;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,805评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,911评论 25 709
  • 作者:李旺成### 时间:2016年4月3日### 上篇 5. 最佳实践# 好了终于要点讲自己的东西了,有点小激动...
    diygreen阅读 30,420评论 54 493

友情链接更多精彩内容