[Android开源]一套快速高效的开发框架EasyAndroid

类库介绍 EasyAndroid

  • 现在Android的框架很多,第三方库也很多,当做一个项目的时候,会考虑怎么整合那么多的资源,以达到复用快速开发。
  • 今天要说的这个框架就是整合了主流Retrofit2网络层封装、Fresco图片加载、都使用OKHTTP3进行网络处理、使用MVP架构,来快速灵活开发复用我们的项目。

框架说明

Retrofit2

为什么要使用它呢?我们来想想如果不使用它的话,我们直接操作OKHTTP3的网络请求,还需要做哪些操作?当发送请求的时候,来封装要以get或者post方式发送,然后回来了GJSON解析成我们需要的实体对象,还要看返回的数据相应码等等,来正确解析我们的数据,那么Retrofit2就是为了高效解决这些事情的,当然Retrofit2不止这些功能,具体大家可看API。

Fresco

比较了一些主流的图片加载以及各种对比,Fresco算是综合比较好的,支持较多,更新及时。

OKHTTP3

不解释了 大家都在用

Other类库

都是一些用的比较多的,Cookie自动管理、View注入Butterknife、以及RecycleView下拉刷新BaseRecyclerViewAdapterHelper、Utilcode工具库、Logger日志库 大家以前没用过的可以关注下 都很好用 灵活

MVP 架构思想

下面重点说一下MVP的Clean模式,现在MVP很火,大行其道,不搞一套MVP架构都感觉缺少点啥,哈哈,为什么呢?MVP难道就是简单的加了一个Presenter层吗?显然不是,它是一种思想,如果简单的一个应用每个Activity类中500行搞定,还需要MVP吗?我觉得就不适合了。越大型的APP、越复杂的APP才会让你觉得MVP的好。怎么做到让代码各司其职。

MVP Clean模式

上面这张图就是Clean的架构,为什么需要Clean架构呢,我们来想想,我们把业务逻辑部分都放到了Presenter层,如果这个页面做的逻辑很多,十来个业务操作(请求数据,数据库操作等),这样Presenter也会非常庞大,既然臃肿,我们继续抽象,在Presenter层下面在加一层Use Cases Domain层,专门处理增删改查等任务岂不业务更清晰明了,Presenter只需要执行相关UseCases任务,操作完回调处理就OK了。

MVP Dagger2模式

Dagger2又是个什么东东?我想说你写了Activity或者Fragment依赖Prensenter,然后呢Clean模式又让Presenter依赖UseCases,每次new一个实例进去,然后传递啊等等,想想都累,那么Dagger2可以帮你生成这些实例,你依赖啥,我注入啥,这就是它的精髓依赖注入,不止这些,第三方库,以及其它的提供者都可以进行注入,只要你需要,还有我们的Presenter对象的实例生命周期你怎么管理,UseCases层的对象呢,这一切Dagger2可以帮你做到,可以自定义Scopes,java自动帮你处理

还有一点差点忘了为什么叫Dagger2,版本号2呢,因为它2,哈哈,因为Dagger1使用的是运行时反射机制,这样会影响性能,Dagger2使用编译时自动生成对应代码,直接运行性能不会受到影响。

怎么使用这个库

DEMO代码结构图

  • com.wjj.easy.easyandroidHelper

    • common

      • base

        • BaseActivity
        • BaseFragment
        • BasePresenter
        • BaseView
        • SimpleActivity
        • SimpleFragment
      • di
        • ActivityCommonComponent
        • AppCommonComponent
        • AppCommonModule
        • FragmentCommonComponent
      • net
        • ApiService
        • AppHttp
    • model
    • module
      • login

        • LoginActivity
        • LoginContract
        • LoginPresenter
    • utils
    • AppApplication

在app module里面common包里面包含了业务逻辑层需要实现的代码演示,大家拷贝到自己项目中就行了,里面的base包包含基本的Activity、Fragment封装,我们用的时候只要在继承的时候指定需要的Presenter,会自动帮我们生成这个Presenter实例。

public class LoginActivity extends BaseActivity<LoginPresenter>

di包,就是我们的dagger2使用包了,在这里面提供我们的实例,生成我们通用的注入器,不懂不要紧,不要关心,拿过去用就行了,只用来做一些presenter、task、全局实例的注入、其它大可不必用这个,本来是为了增加代码健壮性、提高效率的不能本末倒置了。要你做的就是在ActivityCommonComponent或者FragmentCommonComponent中注入我们要添加的Activity或者Fragment就行了。

/**
 * Activity注入器
 * @author wujiajun
 */
@ActivityScope
@Component(dependencies = AppCommonComponent.class, modules = {ActivityModule.class})
public interface ActivityCommonComponent extends ActivityComponent {

    void inject(LoginActivity activity);

    void inject(MainActivity activity);
}

net就是Retrofit2封装 ApiService包含全部的接口请求,包括请求参数、请求方式、地址、文件上传、下载,请求格式,都可以注解操作。

    /**
     * 获取注册验证码
     */
    @FormUrlEncoded
    @POST(HOST + "app/sendSMS.do")
    Call<BaseStatus> getVerifyCode(@Field("username") String username, @Field("password") String pwd);

AppHttp就是对我们的接口进行调用处理

    public void getVerifyCode(String username, String pwd, final Http.HttpCallback<BaseStatus> callback) {
        Call<BaseStatus> call = apiService.getVerifyCode(username, pwd);
        call.enqueue(new Http.CallbackDefault(callback));
        call.request();
    }

module里面拿login来举例吧 LoginActivity对LoginPresenter的依赖,以及LoginPresenter对LoginContract.View的依赖,都在类继承的时候指定就好了,会自动帮你生成,不需要传递。

/**
 * 登录Activity
 *
 * @author wujiajun
 */

public class LoginActivity extends BaseActivity<LoginPresenter> implements LoginContract.View {

    @BindView(R.id.set_user_name)
    EditText setUserName;
    @BindView(R.id.set_pwd)
    EditText setPwd;
    @BindView(R.id.set_verify_code)
    EditText setVerifyCode;
    @BindView(R.id.get_verify_code)
    TextView getVerifyCode;
    @BindView(R.id.tv_login)
    TextView tvLogin;
    @BindView(R.id.tool_bar)
    Toolbar toolbar;

    @Override
    protected void initInject() {
        getActivityComponent().inject(this);
    }

    @Override
    protected void initEventAndData() {
        toolbar.setLogo(R.mipmap.icon_app);
        toolbar.setTitle(R.string.app_name);
        toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.white));
        toolbar.setTitleMarginStart(getResources().getDimensionPixelSize(R.dimen.padding_size_30));
        setSupportActionBar(toolbar);
    }

    @Override
    protected int getContentView() {
        return R.layout.activity_login;
    }

    @OnClick({R.id.get_verify_code, R.id.tv_login})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.get_verify_code:
                getPresenter().getVerifyCode(setUserName.getText().toString(), setPwd.getText().toString());
                startActivity(new Intent(this, MainActivity.class));
                break;
            case R.id.tv_login:
                getPresenter().login(setUserName.getText().toString(), setPwd.getText().toString(), setVerifyCode.getText().toString());
                break;
        }
    }

}
  • Presenter也是一样,关注于Task的执行
/**
 * Login Presenter
 * Created by wujiajun on 17/4/7.
 */
public class LoginPresenter extends BasePresenter<LoginContract.View> implements LoginContract.Presenter {

    @Inject
    GetVerifyCodeTask mGetVerifyCodeTask;
    @Inject
    LoginTask mLoginTask;

    @Inject
    public LoginPresenter() {
    }

    @Override
    public void getVerifyCode(String userName, String pwd) {
        mGetVerifyCodeTask.setUserName(userName);
        mGetVerifyCodeTask.setPwd(pwd);
        mGetVerifyCodeTask.setCallback(new UseCase.Callback<BaseStatus>() {
            @Override
            public void success(BaseStatus baseStatus) {
                getView().toast("getVerifyCode success!");
            }

            @Override
            public void fail() {
                getView().toast("getVerifyCode fail!");
            }
        });
        getThreadExecutor().execute(mGetVerifyCodeTask);
    }

    @Override
    public void login(String userName, String pwd, String verifyCode) {
        getView().showLoading();
        mLoginTask.setUserName(userName);
        mLoginTask.setPwd(pwd);
        mLoginTask.setVerifyCode(verifyCode);
        mLoginTask.setCallback(new UseCase.Callback<LoginResponse>() {
            @Override
            public void success(LoginResponse loginResponse) {
                getView().toast("login success!");
            }

            @Override
            public void fail() {
                getView().toast("login fail!");
            }
        });
        getThreadExecutor().execute(mLoginTask);
    }
}

domain层只关注于怎么完成这个任务 请求验证码或者登陆操作

/**
 * 获取验证码任务
 *
 * @author wujiajun
 */

public class GetVerifyCodeTask extends AbstractUseCase {

    String publicKey = "11";

    String userName;
    String pwd;

    @Inject
    AppHttp appHttp;

    @Inject
    public GetVerifyCodeTask() {
    }

    @Override
    public void run() {
        appHttp.getVerifyCode(userName, SecretUtils.encryptByPublicKey(pwd, publicKey), new Http.HttpCallback<BaseStatus>() {
            @Override
            public void onResponse(BaseStatus baseStatus) {
                getCallback().success(baseStatus);
            }

            @Override
            public void onFailure(Throwable t) {
                getCallback().fail();
            }
        });
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

}

结语

EasyAndroid框架的主要部分都一一介绍了一下,以及它的思想,关于MVP这些我也参考了很多,简单DEMO的很多,真正能够使用的很少,写这个也想大家少走弯路,希望把这个框架能够不断完善,至少DEMO中内容很少,感兴趣的可以Fork修改,有什么好的建议可以私聊我。

GitHub地址

https://github.com/wu928320442/EasyAndroid

需要的环境

  • JDK1.8
  • SDK
  • AndroidStudio开发工具

特性

  • 整合主流HTTP网络、图片加载、MVP(Clean+Dagger2)架构的一套快速高效的开发框架
  • 包含app library 两个Module 组件化开发

用到的第三方框架

  • SDK自带扩展依赖包
  • Retrofit2网络层处理 使用OKHTTP3处理
  • Fresco图片加载处理 使用OKHTTP3处理
  • OKHTTP3 HTTP基础库,提供给网络层处理和图片加载
  • PersistentCookieJar快速Cookie持久化与缓存库
  • Dagger2 依赖注入库,整合Activity,Fragment,Presenter,Task之间的依赖关系
  • Butterknife View的注入库
  • BaseRecyclerViewAdapterHelper Recycler下拉加载库
  • Utilcode实用工具库
  • Logger 一个简洁漂亮的日志打印库

类库导入

compile ‘com.wjj.easy:easyandroid:1.0.0‘

联系方式

  • QQ 928320442
  • Email [email protected]

参考资料

时间: 2024-11-10 00:07:06

[Android开源]一套快速高效的开发框架EasyAndroid的相关文章

看大师讲解Android快速开发框架EasyAndroid

前几天做了小应用,感觉小有成就,名字叫"长见识了",是一款趣味答题类的游戏,题目各种火爆各种经典,下载地址,看似一个简单的答题小游戏却是五脏俱全,从开发流程上都进行了严格的规范,大家有空可以下载玩玩~ 在这个应用中,用到了我以前集成的一个快速开发框架-EasyAndroid,这个框架我以前在做项目的时候总结,整理出来的,对于快速开发Android应用非常实用. 其实,Android应用的开发并不难,我们拿到一款Android应用后,百分之九十以上无外乎有这么几个功能: 1,IOC Mo

饿了么开源项目:便捷高效的Android数据持久化存储框架

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51436972 Android应用开发时经常要对许多数据进行持久化存储,便于以后访问. 对于int.double.boolean这些基本数据,可以使用SharedPreference.对于一些对象,往SharedPreference里存储的时候需要使用序列化技术.如果对象很大,或者碰到列表.数组等结构,就必须使用数据库.而使用数据库比较麻烦,成

Android 最火的快速开发框架AndroidAnnotations使用详解

Android 最火的快速开发框架androidannotations配置详解文章中有eclipse配置步骤,Android 最火快速开发框架AndroidAnnotations简介文章中的简单介绍,本篇注重讲解AndroidAnnotations中注解方法的使用. @EActivity 示例: @EActivity(R.layout.main) public class MyActivity extends Activity { } @fragment 示例: @EFragment(R.lay

Android 最火的快速开发框架androidannotations配置详解

以前给大家介绍的xUtils是国内比较火的快速开发框架,但是它的注解机制不是太稳定而且注解可选也比较少,今天给大家介绍一个国外的一个框架主要专注于注解的开发,简化Android代码编写,因为配置注意事项较为复杂,所以先详细介绍一下配置: git官网:https://github.com/excilys/androidannotations 下载完解压目录如上,AndroidAnnotations是源码工程,example是例子工程, 打开\examples\HelloWorldEclipse,如

Android 最火的快速开发框架XUtils之注解机制详解

在上一篇文章Android 最火的快速开发框架XUtils中简单介绍了xUtils的基本使用方法,这篇文章说一下xUtils里面的注解原理. 先来看一下xUtils里面demo的代码: @ViewInject(R.id.tabhost) private FragmentTabHost mTabHost; @ViewInject(R.id.big_img) private ImageView bigImage; 可能好多人一看就说这是个what,其实这是Java core里面的内容,做JavaEE

优秀的 Android 开源项目

摘要  转载http://www.trinea.cn/android/android-open-source-projects-view/,方便大家找到自己合适的资料 目录[-] 一.ListView 二.ActionBar 三.Menu 四.ViewPager .Gallery 五.GridView 六.ImageView 七.ProgressBar 八.其他 GitHub上优秀Android开源项目 3. Android开发神器 1.Xabber客户端 2.oschina客户端 3.手机安全

GitHub 优秀的 Android 开源项目

转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包含ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其它如Dialog.Toast.EditText.TableView.Activity Animation等等. 一.ListView android-pulltorefresh 一个强大的拉动

GitHub上最火的74个Android开源项目(收藏)

GitHub上最火的40个Android开源项目(一) GitHub上最火的40个Android开源项目(二) GitHub上最火的74个Android开源项目(三) GitHub上最火的40个iOS开源项目(一) GitHub上最火的40个iOS开源项目(二) GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你达到事半功倍的效果. 下面,就让我们

【转】GitHub 优秀的 Android 开源项目

转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等. 一.ListView android-pulltorefresh 一个强大的拉动