okHttp,greenDao,EventBus组合封装

zzyandroid

介绍

开门见山,大体思路是在Activity中启动服务,通过服务创建Http请求,请求处理结果通过EventBus通知前台更新。

okHttp封装  首先实现下面接口, TimeUnit.SECONDS);
        return okHttpClient;
    }

/**
     * 请求配置
     *
     * @return
     */
    @Override
    public Request.Builder getRequestBuilder() {
        return new Request.Builder()
                .addHeader(CONTENT_TYPE_KEYCONTENT_TYPE)
                .addHeader(ACCEPT_KEYACCEPT);
    }

/**
     * 处理接口返回
     * @return
     */
    @Override
    public Callback getResponseCallBack() {
        return new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                onFailed(e);
            }

@Override
            public void onResponse(Response response) throws IOException {
                if (response.isSuccessful())
                    onSuccess(response);
                else
                    throw new IOException();
            }
        };
    }

/**
     * 如果子类需要处理失败信息 重写该方法
     *
     * @param exception
     */
    @Override
    public void onFailed(@NonNull Exception exception) {
        errorMessage = HandleOkHttpException.handleMessage(exception);
        printLogger(errorMessage);
        //通知前台更新 失败后返回子类对象 在Activity里注册子类的监听
        EventBus.getDefault().post(getPostEvent());
        Logger.e(errorMessage);
    }

/**
     * 启动网络请求
     *
     * @param okHttpClient
     @param request
     @param callback
     */
    @Override
    public void execute(OkHttpClient okHttpClient, Request request, Callback callback) {
        okHttpClient.newCall(request).enqueue(callback);
    }

/**
     * 打印日志,写入sd卡并提交腾讯统计服务
     *
     * @param body
     */
    protected void printLogger(String body) {
        printLog.setResponseTime(TimeUtils.getCurrentTimeInString(new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒")));
        printLog.setResponseBody(body);
        printLog.printLogToSdCard(context);
    }

public String getErrorMessage() {
        return errorMessage;
    }

public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }
}

简单实现后,子类继承即可方便调用,而且少去很多重复代码。下面贴出抽象类后的代码,以请求百度地址为例:

package cn.org.cfpamf.data.okHttp;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;

import com.orhanobut.logger.Logger;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

import java.io.IOException;
import java.util.UUID;

import cn.org.cfpamf.data.database.DatabaseManager;
import cn.org.cfpamf.data.sql.db.Baidu;
import de.greenrobot.event.EventBus;

/**
* 项目名称:Zhnx
* 类描述:
* 创建人:zzy
* 创建时间:2015/11/10 11:00
* 修改人:Administrator
* 修改时间:2015/11/10 11:00
* 修改备注:
*/
public class BaiduTestOkHttp extends AbstractBaseOkHttp {

public static final String TYPE_BAIDU = "BaiduTestOkHttp";

/**
     * @param context
     @param bundle
     */
    public BaiduTestOkHttp(@NonNull Context context, @NonNull Bundle bundle) {
        super(context, bundle);
    }

@Override
    public AbstractBaseOkHttp getPostEvent() {
        return this;
    }

@Override
    public String getUrl() {
        return "Http://www.baidu.com";
    }

@Override
    public Request getRequest() {
        return getRequestBuilder().url(getUrl()).build();
    }

/**
     * 没有body
     *
     * @return
     */
    @Override
    public RequestBody getRequestBody() {
        return null;
    }

@Override
    public void onSuccess(@NonNull Response response) {
        try {
            String strResponse = response.body().string();
            Baidu baiu = new Baidu();
            baiu.setId(UUID.randomUUID().toString());
            baiu.setResponse(strResponse);
            //插入数据库
            new DatabaseManager<Baidu>(context).insert(baiu);
            //通知前台更新
            EventBus.getDefault().post(baiu);
            Logger.d(strResponse);
        } catch (IOException e) {
            onFailed(e);
        }
    }
}

大家可以看到子类实现可以很简单而且很清晰明了,项目中的日志打印也封装在抽象类中,更是省去了处处调用日志打印的繁琐,
大家注意到里面有个getPostEvent()方法return this,这是为了每个接口失败的返回都通过网络对象通知前台,因为懒得定义新的对象再post通知,
这个例子中成功请求后就往前台通知接口中返回的数据,这样在实际项目中的确是有用的,像前台要知道更新了什么数据,更新了多少条,很容易就实现了。
数据库是在greenDao的基础上抽象出了一个DataBaseManager通过泛型可以简单实现数据中每张表的增删改查。看了下面接口,大家应该就明白了:
package cn.org.cfpamf.data.database;

import java.util.List;

/**
* 项目名称:groupBackstage
* 类描述:
* 创建人:zzy
* 创建时间:2015/8/28 17:05
* 修改人:Administrator
* 修改时间:2015/8/28 17:05
* 修改备注:
*/
public interface IDatabase<M> {

void insert(M m);

void delete(M m);

void insertOrReplace(M m);

void update(M m);

M selectByPrimaryKey(Class<M> entityClass, String Id);

List<M> loadAll(Class<M> entityClass);

void refresh(M m);

/**
     * Closing available connections
     */
    void closeDbConnections();

/**
     * Delete all tables and content from our database
     */
    void dropDatabase();

/**
     * 事务
     */
    void runInTx(Runnable runnable);

}

基本的增删改查是没有问题了。具体启动是通过服务启动的:

package cn.org.cfpamf.data;

import android.app.IntentService;
import android.content.Intent;

import cn.org.cfpamf.data.bus.NetStatusEvent;
import cn.org.cfpamf.data.factory.OkHttpFactory;
import cn.org.cfpamf.data.util.NetWorkUtils;
import de.greenrobot.event.EventBus;

/**
* 项目名称:Zhnx
* 类描述:
* 创建人:zzy
* 创建时间:2015/11/10 10:42
* 修改人:Administrator
* 修改时间:2015/11/10 10:42
* 修改备注:
*/
public class ApiService extends IntentService {

/**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     */
    public ApiService() {
        super("ApiService");
    }

@Override
    public void onCreate() {
        super.onCreate();
    }

@Override
    protected void onHandleIntent(Intent intent) {
        if (!NetWorkUtils.isNetworkConnected(getApplicationContext())) {
            //在baseActivity里注册即可
            EventBus.getDefault().post(newNetStatusEvent(NetStatusEvent.Please_Connect_To_The_Network_And_Try_Again));
        } else {
            OkHttpFactory.createHttp(this, intent.getType(), intent.getExtras());
        }
    }

@Override
    public void onDestroy() {
        super.onDestroy();
    }
}

前台所有请求通过调用服务启动,并由IntentService自己管理生命周期,网络处理完毕后即可自己释放掉,而且统一对网络进行判断,通过Bundle携带数据过来,并传递给Http请求。具体Get,post请求源码中有例子,这里就不一一描述,前台接受如下:
package cn.org.cfpamf.zhnx;

import android.widget.TextView;

import butterknife.Bind;
import cn.org.cfpamf.data.base.BaseActivity;
import cn.org.cfpamf.data.manager.StartServiceManager;
import cn.org.cfpamf.data.okHttp.BaiduTestOkHttp;
import cn.org.cfpamf.data.sql.db.Baidu;

public class MainActivity extends BaseActivity {

@Bind(R.id.text_response)
    TextView text_response;

@Override
    protected void setToolbar() {
    }

@Override
    protected void setLayoutContentView() {
        setContentView(R.layout.activity_main);
    }

@Override
    protected void afterView() {
        StartServiceManager.startBaiduOkHttp(this);
    }

/**
     * 处理失败信息
     *
     * @param baiduTestOkHttp
     */
    public void onEventMainThread(BaiduTestOkHttp baiduTestOkHttp) {
        createHintDialog("失败", baiduTestOkHttp.getErrorMessage());
    }

/**
     * 处理成功信息
     * @param baidu
     */
    public void onEventMainThread(Baidu baidu) {
        //更新UI
        text_response.setText(baidu.getResponse());
    }
}

总结这是本人一点点小分享,有兴趣的大家可以下载源码查看,地址是:https://github.com/zzyandroid0425/EXP 
源码中还有好多项目中经常用到的东西,比如常见的工具类,常用的BaseRecyclerViewAdapter,AotuGridLayoutManager,也都是自己查询资料,并总结到里面,慢慢的做为一个项目的基础框架使用,后期还会加入android data binding,自己也是准备在现在的项目中去试用这个官方的框架。一起学习。谢谢观看!

okHttp,greenDao,EventBus组合框架项目中实战的更多相关文章

  1. 如何在Crystal框架项目中内置启动MetaQ服务?

    当Crystal框架项目中需要使用消息机制,而项目规模不大.性能要求不高时,可内置启动MetaQ服务器. 分步指南 项目引入crystal-extend-metaq模块,如下: <depende ...

  2. 如何在Crystal框架项目中内置启动Zookeeper服务?

    当Crystal框架项目需要使用到Zookeeper服务时(如使用Dubbo RPC时,需要注册服务到Zookeeper),而独立部署和启动Zookeeper服务不仅繁琐,也容易出现错误. 在小型项目 ...

  3. 关于SSM框架项目中jsp页面EL表达式使用的一些疑问(一)

    问题 ssm框架整合中,jsp页面中EL表达式所引用的对象“page”可以在controller中使用mav.addObject(“page”,pag )进行添加,如果省略mav.addObject( ...

  4. RabbitMQ之项目中实战

    说了那么多,还不是为了在项目中进行实战吗,在实践中检验真理,不然我学他干嘛,不能解决项目中的实际问题的技术都是耍流氓... 一.后台管理系统发送消息 瞎咧咧:后台管理系统发送消息到交换机中,然后通知其 ...

  5. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十五节--缓存小结与ABP框架项目中 Redis Cache的实现

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 缓存 为什么要用缓存 为什么要用缓存呢,说缓存之前先说使用缓存的优点. 减少寄宿服务器的往返调用(round-tr ...

  6. StrangeIoc框架学习----在项目中实战

    最近,因为公司的项目一直在研究StrangeIoc框架,小有所得,略作记录. StrangeIoc是一款基于MVCS的一种框架,是对MVC思想的扩展,是专门针对unity开发的一款框架,非常好用. 一 ...

  7. Android GreenDao 在组件化项目中的一个问题 - 2018年7月5日21:15:14

    组件化项目使用GreenDao时注意的事项: 1.要在组件化中的基础库(domain层)创建实体类: 2.如果sycn之后不能生产Dao文件,使用 Android Studio 的Gradle插件重新 ...

  8. laravel+vue组合的项目中引入ueditor(打包成组件形式)

    前言:最近写东西需要用到ueditor,并且需要是在vue组件中引入. (本博客默认你已经配置了laravel+vue的项目环境,如果还没有配置好的的小伙伴,可以看看我的另一篇博客,链接: http: ...

  9. 【一起学设计模式】观察者模式实战:真实项目中屡试不爽的瓜娃EventBus到底如何实现观察者模式的?

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 之前出过一个设计模式的系列文章,这些文章和其他讲设计模式的文 ...

随机推荐

  1. EOS.IO技术学习

    如今很火的项目EOS的学习,以下主要的内容是基于白皮书 参考: http://chainx.org/paper/index/index/id/20.html EOS.IO软件引入了一种新的块链架构,旨 ...

  2. Makefile系列之三 : 变量

    一.变量的基础 变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来.如果你要使用真实的“$”字符,那么你需要用“$$”来表示 ...

  3. [New learn]AutoLayout调查基于IB

    代码:https://github.com/xufeng79x/AutoLayout-IB 1.简介 Autolayout旨在解决不同高宽度的屏幕下的显示问题,通过增加给控件增加约束来达到不同屏幕间的 ...

  4. 阿里云Centos等更新源设置成阿里源方法。

    https://help.aliyun.com/knowledge_detail/5974184.html ---------------------------------------------- ...

  5. BZOJ1898: [Zjoi2004]Swamp 沼泽鳄鱼

    1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 478  Solved: 286[Submit][St ...

  6. 前端读者 | 百度前端编码规范(JS)

    本文来自:百度FEX 1 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对J ...

  7. maven创建springboot项目

    1.new Project 2.选择spring Initializr 3.选择next,可以自定义group.artifact,type里可以选择maven也可以选择gradle 4.选择sprin ...

  8. org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 32; 元素类型为 "key" 的内容必须匹配 "(column)*"

    报错:部分错误信息,主要查看CauseBy Caused by: org.hibernate.InvalidMappingException: Unable to read XML at org.hi ...

  9. json_decode转码无效

    由于最近从原来常用的utf-8的字符转到了gbk:所以,在用json_decode的时候遇到了返回为空: 经查找发现是json_decode和json_encode只针对utf8字符串有效: 于是用到 ...

  10. Loj#6433「PKUSC2018」最大前缀和(状态压缩DP)

    题面 Loj 题解 先转化题意,其实这题在乘了\(n!\)以后就变成了全排列中的最大前缀和的和(有点拗口).\(n\leq20\),考虑状压\(DP\) 考虑一个最大前缀和\(\sum\limits_ ...