转载:http://www.jianshu.com/p/22ff8b5fdadc

搭建一个新的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 开源库的选型

项目新建重构

对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

让你Android开发更简单的更多相关文章

  1. 云如何让App开发更简单?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 互联网"下半场",移动App开发对于质量.速度的要求更加苛刻.4月初,腾讯云正式上线移动开发平台MobileLine,借 ...

  2. 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。

    微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...

  3. 圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单

    圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单   ////  CircleCore.h//  Quartz////  Created by 仙人掌 on 12 ...

  4. 让开发更简单 —— Coding Enterprise 发布

    今天,我们很高兴地宣布 Coding Enterprise 发布了 —— Coding Enterprise 是 CODING 专为企业打造的软件开发协作平台,提供了针对中小型企业的公有云版本和针对大 ...

  5. 中兴应用之星携手天翼开放平台:让APP开发更简单

    日前,业内率先的APP开发平台运营商中兴应用之星与中国电信天翼开放平台达成战略合作.即广大用户通过天翼开放平台,可直接享受到应用之星提供的"APP开发服务".   应用之星.中兴通 ...

  6. 这些小工具让你的Android 开发更高效

    在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...

  7. 腾讯优测| 让Android屏幕适配开发更简单-Google百分比布

    文/腾讯优测工程师 吴宇焕 腾讯优测优社区干货精选~ 相信开发同学都被安卓设备碎片化的问题折磨过,市面上安卓手机的主流屏幕尺寸种类繁多,给适配造成很大的困难.就算搞定了屏幕尺寸问题,各种分辨率又让人眼 ...

  8. Unity3D游戏开发之SQLite让数据库开发更简单

    各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大 ...

  9. MVVM With ReactiveCocoa让移动开发更简单

    作者:@雷纯锋2011 MVVM是一种软件架构模式,它是 Martin Fowler 的 Presentation Model 的一种变体,最先由微软的架构师 John Gossman 在 2005 ...

随机推荐

  1. angularjs结合d3js实现资源展示

    转载请注明出处: 转载自Bin's Blog:  angularjs & d3 实现资源展示( http://www.wenbin.cf/post/27/ ) angularjs结合d3js实 ...

  2. OracleHelper类

    using System; using System.Collections; using System.Collections.Generic; using System.Data; using S ...

  3. Windows系统下Oracle每天自动备份

    linux和unix下面使用shell可以很方便实现,如果windows环境下可以结合计划任务实现 创建备份目录d:\backup, 创建批处理命令Bak.bat,编写备份脚本 exp user/pa ...

  4. 大数据系列(1)——Hadoop集群坏境搭建配置

    前言 关于时下最热的技术潮流,无疑大数据是首当其中最热的一个技术点,关于大数据的概念和方法论铺天盖地的到处宣扬,但其实很多公司或者技术人员也不能详细的讲解其真正的含义或者就没找到能被落地实施的可行性方 ...

  5. PHP中的回调函数和匿名函数

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  6. 为什么 MySQL 回滚事务也会导致 ibd 文件增大?

    一个简单的测试: start transaction; insert into tb1 values(3, repeat('a', 65000),'x',1); --commit; rollback; ...

  7. linux top 源码分析

    /* * Copyright (c) 2008, The Android Open Source Project * All rights reserved. * * Redistribution a ...

  8. gcc中__builtin_return_address和__VA_ARGS__

    — Built-in Function: void * __builtin_return_address (unsigned int level) This function returns the ...

  9. Appium学习实践(五)遇到的坑(记录自己工作中遇到的坑以及解决方案,不定时更新)

    1.错误截图,有时候测试用例执行错误的话,相对于复杂的log,一张错误截图也许能更明确哪里出的问题(当然有时,截图+log还是最好了) 坑:本来是想测试用例fail的时候捕获异常来执行截图操作,但是由 ...

  10. 洛谷11月月赛round.1

    太感动了#2 thwfhk 240 (801ms) 100 100 40   又一张明信片,话说10月的怎么还没收到   P2246 SAC#1 - Hello World(升级版) 题目背景 一天, ...