美文网首页技术开发技术科普贴。it技术
你拥有它,让你Android开发更简单

你拥有它,让你Android开发更简单

作者: 诸葛不摇扇 | 来源:发表于2016-11-21 17:56 被阅读13519次
image.png image.png 576d518130720.png
更多: https://github.com/meikoz/Basic
欢迎Follow我的GitHub: https://github.com/meikoz

搭建一个新的Android项目,你会怎么做?

每个人对应用框架的理解不相同,但是最终达到的效果应该是一样:
①降低项目的复杂性
②易扩展、易修改、可重用性强、可维护性强
③职责单一,功能清晰

在android开发项目中,我们首先要考虑每个项目的共同点,比如说:Mvp、网络请求层、Base存放View的基类、Log日志、App crash、刷新加载更多、Loading、广告图、支持ListView,RecyclerView的BaseAdater、通知栏沉浸式、图片加载缓存、底部导航功能...
那么这些功能是每个项目都必须需要的功能,那么可不可以以把这些通用的东西抽取呢?

项目工程搭建

App工程结构搭建:几种常见Android代码架构分析

App工程包结构.png

包名的作用一目了然,在别人接手这个项目的时候就会相对简单

  • adapter 适配器,如果业务复杂,根据不同的业务可以添加子包来进行分类
  • api 网络请求层的封装 retrofit &okhttp3 &rxjava
  • base 用来存放View的基类,例如BaseAcitivity、BaseFragment、BaseSwipeBackActivity、BasePresent
  • manage 用来存放一些通用的管理类: Crash、ImageLoader、Logger
  • model 封装Mvp Logic池,通过注解的方式contact和presenter进行实例化和bindView,使用时直接使用mPresenter
  • ui 自定义View 滑动删除,底部导航

common libraries 开源库的选型

//squareup
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'io.reactivex:rxjava:1.1.5'
compile 'io.reactivex:rxandroid:1.2.0'
compile 'com.jcodecraeer:xrecyclerview:1.2.7'

项目新建重构

对Android一些常用功能做一些整理封装成basic框架,方便Android初始项目快速开发
https://github.com/meikoz/Basic

仿开眼Demo示例:Basic+Retrofit+Okhttp+Rxjava+Glide
请大家多多关注star和提意见给予支持,从自己的一些实践经验来总结这部分通用的东西作为一份善意的分享。

How Usage

Step 1:

Setup 'Basic' dependencies in build.gradle file:

dependencies {
    compile 'com.meikoz.basic:core:1.0.5'
}

Step 2:

Create subclass of Application extends MainApplication,initialize basic BuildConfig.debug is true in super.onCreate() method before for debug print log.

public class BaseApp extends MainApplication {
    @Override
    public void onCreate() {
        RestApi.getInstance().deBug(true);
        super.onCreate();
    }
}
  • RestApi.getInstance().deBug(true); 是为了Debug打印日志,请上线前删掉此方法#重要#

Step 3:

app usage mvp pattern, View and Presenter need things.
View extends BaseView. Presenter extends BasePresenter<View>.

@Implement(MainLogicImpl.class)
public interface MainLogicI {
    void onLoadData2Remote();

    interface MainView extends BaseView {
        void onLoadSuccessHandler(String responce);
    }
}

public class MainLogicImpl extends BasePresenter<MainLogicI.MainView>
    implements MainLogicI {
    @Override
    public void onLoadData2Remote() {
        getView().onLoadSuccessHandler("请求成功,返回的数据");
    }
}

How to initialize use the Activity.

class MainActivity extends Activity implements MainLogicI.MainView {

   @Override
    protected Class getLogicClazz() {
        return your interface MainLogicI class;// MainLogic是Presenter要实现的接口
    }

    @Override
    protected void onInitData2Remote() {
        super.onInitData2Remote();
       ((MainLogicImpl) mPresenter).onLoadData2Remote();
    }

    @Override
    public void onLoadSuccessHandler(String response) {
    //response是Presenter中返回的数据
   }
}
  • super.onInitData2Remote(); 会初始化Presnter并bindView

Step 4:

Network: Retrofit + okhttp
根据不同业务生成不同Service

public class ApiManager {
    public static APIService createApi() {
        return RestApi.getInstance().create(APIService.class);
    }
    public static UserService createUserApi() {
        return RestApi.getInstance().create(UserService.class);
    }
}

public interface APIService {
    String BASE_URL ="https://github.com/";
    @GET("api/v1/user")
    Call<Response> getUserInfo(@Query("uid") int uid);
}

cool feature

feature 1:实现 Tab +fragment 功能

QQ图片20161121164914.png
public class MainAty extends AppCompatActivity {
    private TabStripView navigateTabBar;

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

        navigateTabBar = (TabStripView) findViewById(R.id.navigateTabBar);
        navigateTabBar.onRestoreInstanceState(savedInstanceState);

        navigateTabBar.addTab(HomeFragment.class,
            new TabStripView.TabParam(R.drawable.ic_tab_strip_icon_feed,
                R.drawable.ic_tab_strip_icon_feed_selected,
                R.string.tab_bar_text_feed));

        navigateTabBar.addTab(DiscoveryFragment.class,
            new TabStripView.TabParam(R.drawable.ic_tab_strip_icon_category,
                R.drawable.ic_tab_strip_icon_category_selected,
                R.string.tab_bar_text_category));

        navigateTabBar.addTab(AutoFragment.class,
            new TabStripView.TabParam(R.drawable.ic_tab_strip_icon_pgc,
                R.drawable.ic_tab_strip_icon_pgc_selected,
                R.string.tab_bar_text_pgc));

        navigateTabBar.addTab(ProfileFragment.class,
            new TabStripView.TabParam(R.drawable.ic_tab_strip_icon_profile,
                R.drawable.ic_tab_strip_icon_profile_selected,
                R.string.tab_bar_text_profile));
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        navigateTabBar.onSaveInstanceState(outState);
    }
}

feature 2:实现仿ios弹窗效果

默认取消确定按钮.png
  • setCancelable(true) 默认显示取消按钮,用法和原生AlertDialog写法一样
new SweetAlertDialog.Builder(MainActivity.this)
             .setTitle("标题")
             .setMessage("描述详细内容?")
             .setCancelable(true)
             .setPositiveButton("确认", new SweetAlertDialog.OnDialogClickListener() {
                  @Override
                   public void onClick(Dialog dialog, int which) {
                      Toast.makeText(MainActivity.this, "确定按钮", Toast.LENGTH_SHORT).show();
                   }
              })
             .show();
只有一个确定按钮.png

![Uploading QQ图片20161121171109_005140.png . . .]

  • setCancelable(false) 这样就只显示一个按钮
new SweetAlertDialog.Builder(MainActivity.this)
             .setTitle("标题")
             .setMessage("描述详细内容?")
             .setCancelable(false)
             .setPositiveButton("确认", new SweetAlertDialog.OnDialogClickListener() {
                  @Override
                   public void onClick(Dialog dialog, int which) {
                      Toast.makeText(MainActivity.this, "确定按钮", Toast.LENGTH_SHORT).show();
                   }
              })
             .show();
左右边都设置按钮.png
  • 左右按钮自定义
new SweetAlertDialog.Builder(MainActivity.this)
             .setTitle("标题")
             .setMessage("描述详细内容?")
             .setCancelable(false)
             .setNegativeButton("左边", new SweetAlertDialog.OnDialogClickListener() {    
              @Override    
              public void onClick(Dialog dialog, int which) {        
                      Toast.makeText(MainActivity.this, "左边" + which, Toast.LENGTH_SHORT).show();    
              }})
             .setPositiveButton("确认", new SweetAlertDialog.OnDialogClickListener() {
                  @Override
                   public void onClick(Dialog dialog, int which) {
                      Toast.makeText(MainActivity.this, "确定按钮", Toast.LENGTH_SHORT).show();
                   }
              })
             .show();

feature 3:CommonAdapter for ListView, RecyclerAdapter for RecyclerView

CommonAdapter for ListView, RecyclerAdapter for RecyclerView
实现 void convert(ViewHolder helper, T item); Replace getView();

feature 4:Logger 漂亮的日志系统

Logger.d(message);
Logger.i(message);
Logger.e(message);
Logger.v(message);
Logger.json(message);


漂亮的日志.png

To do something v2.0.0

  • 网络请求前增加LoadingView,加完完成消失
  • 加载失败统一失败页面,支持重新请求
  • Activity销毁掉,关闭网络请求功能 避免报错
  • EyepetizerApp: 使用Basic框架完成开眼App

Email

zhoujinlongdev@163.com

相关文章

网友评论

  • 知吾煮:如何去掉这个footview和headview的点击事件,动态的能行吗? 能帮忙解决下吗
  • 知吾煮:这个下拉刷新的headview和footerview 都有点击事件,页面添加adapter后,点击headview或者footview 直接崩溃了,出现了角标越界的问题
  • struggling_chen:有些地方值得借鉴,谢谢分享
  • db91d197dedf:感谢作者分享知识!!
  • uncochen:工程稍微大一点,你就会发现这种按作用类型分包有多不合适,建议还是按业务模块分包
    1a2112eae40d: @uncochen 是的 开始我的项目也是这样分,随着功能越来越多,会显得很难维护
  • 夏妍妍:和你聊还是很开心的
  • 00acb3642c55:android studio
  • 宗仁:感觉ui和base文件夹有待商榷
  • 叮宕:为什么图片是wp10的手机……
  • 书啊书:我是看不懂,但不妨碍我点赞啊。
  • fb2a6d4cd6c4:有没有整个的demo呢?让我更样的理解。。。正急需。。。
    诸葛不摇扇:@king2020 github
    诸葛不摇扇:@king2020 正在整理 项目里面有demo
  • happy风仔:很赞! :+1:
  • woitaylor:你的开眼没代码?侵权了?
    诸葛不摇扇:@woitaylor 在我coding上,稍后上传一下
  • _10_01_:如果使用谷歌的安卓架构蓝图,还是推荐使用示例代码中的按业务分层;
    https://github.com/googlesamples/android-architecture/tree/todo-mvp/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp

    业务多点,会有一堆的 Activity、Contract、Fragment、Presenter。
    _10_01_:@谷哥的小弟丶 android-architecture 使用 Fragment 承担 View,貌似作者并没有这样使用。
  • _10_01_:可以考虑使用 RxJava2:
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.0.1'
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    :smile:
  • 633760a964ab:SweetAlertDialog 和 Logger 楼主分享一下
    诸葛不摇扇:@渺渺众生 看下github源码里面有
  • joy_蓝蜘蛛:很不错哦
    诸葛不摇扇:@梓浩_joy 谢谢欧,多多提意见
  • _deadline:没有人不想这样。架构清楚多好,但大部分情况下,你进入公司时app已经基本定型,不太可能去改,其次你的头头,可能并不在乎架构清晰,他要的只是项目能在最短的时间完成功能,速度上线。再其次就算项目一开始就是架构清晰的,但是多人维护,越来越乱!
    cuixbo:@_deadline 说的太对了
    BKQ_SYC:@_deadline 就是,得有人在一个高度一直督查一直维护架构还差不多,不过这个,,,,
    诸葛不摇扇:@_deadline 赞同
  • 诸葛不摇扇:十分抱歉,一不小心把之前的文章删除了,今天整理了一下内容

本文标题:你拥有它,让你Android开发更简单

本文链接:https://www.haomeiwen.com/subject/ftakpttx.html