转载: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. Python聊天室

    小编心语:锵锵锵!各位看官注意了啊,走过路过表错过!上篇博文主要介绍了基于基于Server-Sent Event的简单在线聊天室,相信不管各位是大牛.小牛还是跟小编一样的小白,可能觉得看得不够过瘾,区 ...

  2. docker'部署

    环境:ubuntu-14.04.4-server-amd64 1.更换阿里云源 备份源配置文件: $ sudo cp /etc/apt/sources.list /etc/apt/sources.li ...

  3. 设置ASP.NET MVC站点默认页为.html页 .

    同事部署了一个Asp.Net MVC的站点,希望它的默认页是index.html页,在vs2010中给站点根目录增加了index.html,然后调用没有什么问题,但部署到IIS7上,在功能试图=> ...

  4. CLR简介(一)

    什么是通用语言运行时(CLR),简单来讲: CLR是一个支持多种编程语言及多语言互操作,完整的高级虚拟机. 有点拗口,而且不是很有启发性,但上面的文字是将又大又复杂的CLR的功能归类以便容易理解的第一 ...

  5. SQL*Plus环境变量设置浅析

    SQL*Plus的使用环境是可以通过login.sql 或 glogin.sql脚本来设置的,可能很多初学者或不习惯使用SQL*Plus的老鸟都不知道.因为在如今UI工具(Toad.PL/SQL De ...

  6. 为什么基于TCP UDP服务的一些简单服务端口号都是奇数

    TCP是有NCP(网络控制协议)派生出来的,NCP是单工的,通信需要两个链接,所以会预留奇偶端口号.当TCP/UDP成为传输层协议,每个程序只是用一个端口号,且使用奇端口号.

  7. .NET应用架构设计—表模块模式与事务脚本模式的代码编写

    阅读目录: 1.背景介绍 2.简单介绍表模块模式.事务脚本模式 3.正确的编写表模块模式.事务脚本模式的代码 4.总结 1.背景介绍 要想正确的设计系统架构就必须能正确的搞懂每个架构模式的用意,而不是 ...

  8. windows系统快捷操作の基础篇

    从网上汇总了一些windows系统上常用的快捷键,结合自己的使用经验,将平时使用电脑时最常用的快捷键记录在此.注意这里罗列的是平时最常用到的,其他的一般来说不怎么用到的并不在此列,如果想要完整列表,请 ...

  9. SQL Server 2008 R2——CROSS APPLY 根据数据出现的次数和时间来给新字段赋值

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  10. 2016 最佳 Linux 发行版排行榜

    2015年,不管在企业市场还是个人消费市场都是 Linux非常重要的一年.作为一个自2005年起就开始使用 Linux的 Linuxer ,我门见证了 Linux在过去十年的成长.2016 Linux ...