Android快速开发之appBase——(5).BasePresenter的使用

Android快速开发之appBase——(5).BasePresenter的使用

Presenter是来自MVP中的概念,是用来处理与用户交互的逻辑。在这里更加简单化,Presenter中的方法是根据业务来定义,比如获取消息列表,那么业务常常会这样:先去请求网络,网络正常请求到数据返回并展示在UI层,网络错误没有拿到数据,看看缓存中有没有,然后从缓存中拿到数据并返回并展示在UI层;突然,有一天业务需求发生变化,只允许获取网络,网络错误UI上显示没有消息。如果之前在UI层已经做过数据为空的处理,那么UI层就不用修改任何代码,仅仅只需要修改presenter层,这样就将UI层和业务层区分,并且耦合降低了。

1、概述

BasePresenter仅仅是提取的一个概念,实现的方式有很多种,在这里我采用callback机制,presenter和callback中的方法是对应存在的,比如presenter中getProductsByType(int type),那么这个方法主题中通过异步处理数据,处理完成之后将数据通过callback回传给setProductsByType(Object result)。

类或接口 presenter callback
方法 getProductsByType(int type) setProductsByType(Object result)
执行所在线程 非UI线程 UI线程

2、代码

package com.snicesoft.presenter;

import android.content.Context;

import com.snicesoft.util.NetworkUtil;

public class BasePresenter<C extends BasePresenter.Callback> {
    public interface Callback {

    }

    private Context context;
    protected C callback;

    public void setCallback(C callback) {
        this.callback = callback;
    }

    public BasePresenter(Context context) {
        this.context = context;
    }

    public boolean isNetConnect() {
        return NetworkUtil.isConnect(getContext());
    }

    public Context getContext() {
        return context;
    }
}
  • 代码采用内部接口定义,为了减少代码整体风格不那么臃肿。当然,也可以按照自己的编码风格自定义。
  • 字段说明:context只是为了方便操作一些常用的业务,比如上面提到的网络连接判断。字段都可以按照自己的需求添加,比如这个presenter中需要网络请求,那么可以添加HttpReq模块;再比如需要APICloud云API请求,可以添加APICloudSDK模块。

3、使用范围

常用范围
  • activity:实现callback接口,定义callback所在presenter的对象字段,在onCreate中初始化。
  • fragment:实现callback接口,定义callback所在presenter的对象字段,在onCreate中初始化。

原则上,哪里需要就写哪里。

4、示例

WgouPresenter.java

package com.haier.rrmaker.ui.home.fragment.presenter;

import android.app.ProgressDialog;
import android.content.Context;

import com.alibaba.fastjson.JSON;
import com.haier.rrmaker.R;
import com.haier.rrmaker.http.HttpParams;
import com.haier.rrmaker.http.HttpResult;
import com.haier.rrmaker.http.response.IndexResponse;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.snicesoft.http.HttpReq;
import com.snicesoft.presenter.BasePresenter;
import com.snicesoft.util.CommonUtils;
import com.snicesoft.util.DialogUtil;

public class WgouPresenter extends BasePresenter<WgouPresenter.Callback> {
    public interface Callback extends BasePresenter.Callback {
        void index(IndexResponse response);
    }

    HttpReq httpReq;

    public void setHttpReq(HttpReq httpReq) {
        this.httpReq = httpReq;
    }

    ProgressDialog progressDialog;

    public WgouPresenter(Context context) {
        super(context);
        progressDialog = DialogUtil.getProgressDialog(context);
    }

    protected void showDialog(CharSequence message, boolean... flag) {
        if (flag != null) {
            if (flag.length > 0)
                progressDialog.setCancelable(flag[0]);
            if (flag.length > 1)
                progressDialog.setCanceledOnTouchOutside(flag[1]);
        }
        progressDialog.setMessage(message);
        progressDialog.show();
    }

    protected void closeDialog() {
        if (progressDialog.isShowing())
            progressDialog.dismiss();
    }

    public void index() {
        if (httpReq == null)
            return;
        if (isNetConnect()) {
            showDialog("正在加载");
            httpReq.POST(HttpParams.Wgou.Index, null,
                    new RequestCallBack<String>() {

                        @Override
                        public void onFailure(HttpException arg0, String arg1) {
                            closeDialog();
                            CommonUtils.showToast(getContext(),
                                    R.string.net_error_retry);
                        }

                        @Override
                        public void onSuccess(ResponseInfo<String> arg0) {
                            closeDialog();
                            IndexResponse response = JSON.parseObject(
                                    arg0.result, IndexResponse.class);
                            if (HttpResult.isSuccess(response)) {
                                callback.index(response);
                            } else {
                                CommonUtils.showToast(getContext(), "数据返回错误");
                            }
                        }
                    });
        } else {
            CommonUtils.showToast(getContext(), R.string.net_error);
        }
    }

}

WgouFragment.java

public class WgouFragment extends
        AvFragment<WgouHolder, WgouData, HomeActivity> implements
        WgouPresenter.Callback {
    WgouPresenter wgouService;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        wgouService = new WgouPresenter(fa());
        wgouService.setHttpReq(fa().getApp().httpReq());
        wgouService.setCallback(this);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        wgouService.index();
    }
    @Override
    public void index(IndexResponse response) {
        _holder.index(response);
        _holder.scrollBottom();
    }
}

这里简单举例在Fragment中的使用:

1、首先定义Presenter和Callback

类或接口 WgouPresenter WgouPresenter.Callback 说明
方法 index() index(IndexResponse response) 获取首页信息
执行所在线程 非UI线程 UI线程

2、WgouFragment实现WgouPresenter.Callback

实现index(IndexResponse response)方法,将返回的数据再此方法绑定到对应的UI上。如果业务在开发之前充分沟通,这块完全可以模拟数据进行测试,后期在线上测试环境调试。

对于WgouPresenter的定义在onCreate初始化。onActivityCreated方法中进行index()请求,这只是做个演示。但是请求顺序一定不能错误:必须在WgouPresenter初始化完毕并且View初始化完毕(也就是Holder初始化完毕)

5、最后

一定要注意规范,否则会导致代码混乱。对于这套规范我写了个简单的代码生成器,生成activity和fragment的时候会将holder、data、presenter全部生成好,省去了自己创建的麻烦。
由于编译环境不同,故不提供jar包,直接上源码。

下载地址

时间: 2024-08-14 09:22:00

Android快速开发之appBase——(5).BasePresenter的使用的相关文章

Android快速开发之appBase——(6).HttpReq和APICloudSDK

Android快速开发之appBase--(6).HttpReq和APICloudSDK HttpReq和APICloudSDK都是网络请求组件,都是基于xUtils的HttpUtils重新封装的.接下来讲一下使用方法. 1.HttpReq 看以看到有这么几个方法 GET:GET方式请求 POST:普通的POST表单提交 POST:将数据以流的形式传递 /** * POST请求,用InputStream的方式传递请求参数 * * @param api * 接口地址 * @param reques

Android快速开发之appBase——(1).appBase介绍

Android快速开发之appBase--(1).appBase介绍 一直想写博客,苦于自己的文笔实在不行,在CSDN潜水了好几年,中间差不多3年没有写过博客.原因有二:1.文笔差:2.没时间. 今年开始,时间充裕了,开始计划练练自己的文笔,也让自己成长起来,希望从中能够提升自己的能力.望大家多多支持和关注!! 导读:appBase是什么? appBase是一个Android app开发的基础集合,目的是任何应用都可以在这个基础之上开发app,省去了搭建框架的时间. appBase=xutils

Android快速开发之appBase——实战《购物车》

Android快速开发之appBase--实战<购物车> 最近将appBase实战于各种项目中,也发现了不少问题,并优化了很多功能.今天带给大家一个实战–<购物车>.购物车,在商城app中是必不可少的一部分,也是使用的比较多的,这里简单的做一个效果. 先来看看效果图 1.创建项目 第一种.引用appBase项目即可 第二种.将appBase的jar文件copy到libs下 我用的第二种,如上图所示. 2.代码生成 通过代码生成器生成Activity.Presenter.Adapte

Android快速开发之appBase——(2).万能的Adapter

Android快速开发之appBase--(2).万能的Adapter android的Adapter是常用的一个组件,自定义的adapter基本上都是集成BaseAdapter,然后实现getView等一系列方法.时间长了,难免让人感觉到写的重复性代码过多,那么万能的Adapter讲解放你的双手. 对比 BaseAdapter package com.snicesoft.appbase.demo; import java.util.ArrayList; import java.util.Lis

Android快速开发之appBase——(3).详解IHolder和IData

Android快速开发之appBase--(3).详解IHolder和IData IHolder和IData是AVLib的两个组件,在前面已经使用过了,那么这一篇将会详细说明这两个组件的用法. IHolder IHolder是AVLib中View自动绑定的组件规范,所有@Id使用只能存在IHolder派生的类中. 源码 package com.snicesoft.avlib.rule; /** * @author zhe * @since 2015年4月15日 上午9:54:17 * @vers

Android快速开发之appBase——(4).详解com.snicesoft.Application和BaseActivity

Android快速开发之appBase--(4).详解com.snicesoft.Application和BaseActivity 在Android快速开发之appBase--(1).appBase介绍中使用过com.snicesoft.Application和BaseActivity,本篇则解开她们的面纱. 1. com.snicesoft.Application 1) 源码分析 package com.snicesoft; import java.util.ArrayList; import

Android Studio快速开发之道

概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. Postfix completion 介绍 Postfix completion 是IntelliJ IDEA很早就有的功能,该功能基于已经输入的表达式和你添加的后缀来实现另一个你想要的表达式.例如在布尔表达式之后加上后缀if就是if语句 . 常用后缀介绍 下面介绍一下个人工作中觉得比较常用的几个后缀

Android 异步开发之 AsyncQueryHandler

AsyncQueryHandler: 官方解释是一个异步帮助类(A helper class to help make handling asynchronous ContentResolver queries easier.) .这个类的主要作用就是异步对DB数据库进行操作,加快其数据处理的速度(这个非常重要,特别是大容量的数据处理时,例如几千联系人的数据读取,按正常的处理速度会非常的慢,使用AsyncQueryHandler,这就会大大的加快速度,增加用户的良好体验). AsyncQuery

Android 安全开发之 ZIP 文件目录遍历

1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接so.dex或者odex文件,轻则产生本地拒绝服务漏洞,影响应用的可用性,重则可能造成任意代码执行漏洞,危害用户的设备安全和信息安全.比如近段时间发现的"寄生兽"漏洞.海豚浏览器远程命令执行漏洞.三星默认输入法远程代码执行漏洞等都与ZIP文件目录遍历有