登录 立即注册
安币:

重庆时时彩反倍投技巧|Android 框架设计Demo,一个简单的MVP示例搜索功能,网络请求用Retrofit+RxJava实现 ... [复制链接]

2018-3-13 14:59
Rf2698 阅读:96 评论:0 赞:0
Tag:  
本文来源:http://www.oneupabq.com/a/www.pds.gov.cn/

重庆时时彩独胆倍投 www.oneupabq.com,  随着思考的深入,她愈发相信“家”不在这个人世间。原告请求本院判令:1、被告立即支付2016年01月31日所拖欠的借款6万元以及从2016年06月01日暂计至2016年11月17日的违约金1.69万元(违约金应计算至被告实际偿还借款之日至);2、被告承担本案全部诉讼费用、律师取证费0.1万元等一切费用。

项目的业务逻辑不断变更,需求也不断扩张,导致在原有代码基础上去处理也变得越来越繁琐,这时项目框架和代码规范就显得非常必要了。Google 在 GitHub 上的 Android Architecture Blueprints 提供了很多框架 Demo,现在对其中的 todo?mvp 做一个简单的分析,并模仿写一个简单的 Demo。

一、MVP 基本结构

MVP 从更早的 MVC 框架演变过来,与 MVC 有一定的相似性:Controller/Presenter 负责逻辑的处理,Model 提供数据,View 负责显示。在 Android 上可以大大减轻 Activity 的负担,同时增加扩展性和耦合度。

图片描述

View:负责绘制 UI 元素、与用户进行交互(在 Android 中体现为 Activity)
Model:负责存储、检索、操纵数据(有时也实现一个 Model interface 用来降低耦合)
Presenter:作为 View 与 Model 交互的中间纽带,处理与用户交互的负责逻辑
二、TodoMVP 框架结构

图片描述

有如下几个步骤:

在 Activity 中初始化 Fragment 和 Presenter 的实例,并给 Fragment 设置 Presenter
Fragment 实现了 View 的接口,并拥有 Presenter 的引用,Fragment 的非 UI 操作都通过调用 Presenter 来实现,同时 Presenter 把处理好的结果通过回调 View 回传给 Fragment 显示
Presenter 拥有 View 的引用,具体的处理事情并回调 View 返回接口
正因为 UI 与具体实现相分离,使 Activity 只需要根据回传状态渲染 UI,Presenter 中也只用考虑处理逻辑,将处理好的状态告知 View 即可。在应用 UI 经常变更时会有非常大的优势。

三、参照写一个简单的 Demo

写一个简单的搜索 Demo,输入关键字,在点击搜索按钮时开始搜索,并将返回结果显示出来。

SearchContract 的实现,View 中包含搜索成功和搜索失败的回调,Presenter 中主要是搜索方法和 Activity 生命周期的方法。

public interface SearchContract {

    interface View extends BaseView<SearchContract.Presenter> {

        void onSearchSuccess(String result);

        void onSearchFailure(String message);
    }

    interface Presenter extends BasePresenter {

        void stop();

        void startSearch(String searchKey);
    }
}

在 MainActivity 中实现了 SearchContract.View,并创建 SearchPresenter 实例和初始化 UI。

public class MainActivity extends AppCompatActivity implements SearchContract.View {

    private SearchContract.Presenter mPresenter;

    private EditText etSearchKey;
    private TextView tvResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new SearchPresenter(this, new DataManager());

        etSearchKey = (EditText) findViewById(R.id.et_search_key);
        tvResult = (TextView) findViewById(R.id.tv_result);

        findViewById(R.id.btn_search).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String searchKey = etSearchKey.getText().toString();
                if (TextUtils.isEmpty(searchKey)) {
                    showToast("搜索关键字不能为空!");
                    return;
                }
                mPresenter.startSearch(searchKey);
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        mPresenter.start();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mPresenter.stop();
    }

    @Override
    public void onSearchSuccess(String result) {
        tvResult.setText(result);
    }

    @Override
    public void onSearchFailure(String message) {
        tvResult.setText(message);
    }

    @Override
    public void setPresenter(SearchContract.Presenter presenter) {
        mPresenter = presenter;
    }

    public void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

创建 SearchPresenter 实现 SearchContract.Presenter 接口,其中的搜索方法通过调用 Model 层的接口获取数据,并处理完结果后将状态回调给 View。

public class SearchPresenter implements SearchContract.Presenter {

    private SearchContract.View searchView;
    private CompositeSubscription mCompositeSubscription;
    private DataManager dataManager;
    private String mResult;

    public SearchPresenter(SearchContract.View searchView, DataManager dataManager) {
        this.searchView = searchView;
        this.dataManager = dataManager;

        this.searchView.setPresenter(this);
    }

    @Override
    public void start() {
        mCompositeSubscription = new CompositeSubscription();
    }

    @Override
    public void stop() {
        if (mCompositeSubscription.hasSubscriptions()) {
            mCompositeSubscription.unsubscribe();
        }
    }

    @Override
    public void startSearch(String searchKey) {
        mCompositeSubscription.add(dataManager.getSearchResult(searchKey)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<ResponseBody>() {
                    @Override
                    public void onCompleted() {
                        if (mResult != null) {
                            searchView.onSearchSuccess(mResult);
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();
                        searchView.onSearchFailure("请求失败!!!");
                    }

                    @Override
                    public void onNext(ResponseBody responseBody) {
                        if (responseBody != null) {
                            try {
                                mResult = responseBody.source().readUtf8();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                })
        );
    }
}
分享到:
我来说两句
facelist
您需要登录后才可以评论 重庆时时彩独胆倍投登录 | 立即注册
所有评论(0)

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区

重庆时时彩独胆倍投广告投放| 下载客户端|申请友链|手机版|站点统计|重庆时时彩独胆倍投 ( 粤ICP备15117877号 )

返回顶部
小说 小说 小说 小说 小说 小说
小说 小说 小说 小说 小说 小说
小说 小说 小说 小说 小说 小说
新加坡天天彩八点开彩 20选5开奖走势图 新疆35选7开奖 江西快3玩法介绍 河南11选5开奖规则
北京赛车pk10直播软件 重庆时时彩五分彩 北京十一选五任选六逸漏 历史广西快乐十分开奖 内蒙古十一选五遗漏号