让你Android开发更简单
转载:http://www.jianshu.com/p/22ff8b5fdadc
搭建一个新的Android项目,你会怎么做?
每个人对应用框架的理解不相同,但是最终达到的效果应该是一样:
①降低项目的复杂性
②易扩展、易修改、可重用性强、可维护性强
③职责单一,功能清晰
在android开发项目中,我们首先要考虑每个项目的共同点,比如说:Mvp、网络请求层、Base存放View的基类、Log日志、App crash、刷新加载更多、Loading、广告图、支持ListView,RecyclerView的BaseAdater、通知栏沉浸式、图片加载缓存、底部导航功能...
那么这些功能是每个项目都必须需要的功能,那么可不可以以把这些通用的东西抽取呢?
项目工程搭建

包名的作用一目了然,在别人接手这个项目的时候就会相对简单
- 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-architecture: 谷歌Mvp示例code-Android Architecture MVP + Dagger2
- retrofit: retrofit Square出品的网络请求库,极大的减少了http请求的代码和步骤.
- okhttp: 据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了
- rxjava: rxjava提供优雅的响应式Api解决异步请求.
- ButterKnife: ButterKnife解放控件对象实例化,从此告别findviewbyId
- gilde: Google推荐:Glide功能强大图片加载缓存库
- LeakCanary: LeakCanarySquare出品的专门用来检测Android和Java的内存泄漏
//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 功能

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弹窗效果

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);

To do something v2.0.0
- 网络请求前增加LoadingView,加完完成消失
- 加载失败统一失败页面,支持重新请求
- Activity销毁掉,关闭网络请求功能 避免报错
- EyepetizerApp: 使用Basic框架完成开眼App
让你Android开发更简单的更多相关文章
- 云如何让App开发更简单?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 互联网"下半场",移动App开发对于质量.速度的要求更加苛刻.4月初,腾讯云正式上线移动开发平台MobileLine,借 ...
- 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。
微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...
- 圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单
圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单 //// CircleCore.h// Quartz//// Created by 仙人掌 on 12 ...
- 让开发更简单 —— Coding Enterprise 发布
今天,我们很高兴地宣布 Coding Enterprise 发布了 —— Coding Enterprise 是 CODING 专为企业打造的软件开发协作平台,提供了针对中小型企业的公有云版本和针对大 ...
- 中兴应用之星携手天翼开放平台:让APP开发更简单
日前,业内率先的APP开发平台运营商中兴应用之星与中国电信天翼开放平台达成战略合作.即广大用户通过天翼开放平台,可直接享受到应用之星提供的"APP开发服务". 应用之星.中兴通 ...
- 这些小工具让你的Android 开发更高效
在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...
- 腾讯优测| 让Android屏幕适配开发更简单-Google百分比布
文/腾讯优测工程师 吴宇焕 腾讯优测优社区干货精选~ 相信开发同学都被安卓设备碎片化的问题折磨过,市面上安卓手机的主流屏幕尺寸种类繁多,给适配造成很大的困难.就算搞定了屏幕尺寸问题,各种分辨率又让人眼 ...
- Unity3D游戏开发之SQLite让数据库开发更简单
各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大 ...
- MVVM With ReactiveCocoa让移动开发更简单
作者:@雷纯锋2011 MVVM是一种软件架构模式,它是 Martin Fowler 的 Presentation Model 的一种变体,最先由微软的架构师 John Gossman 在 2005 ...
随机推荐
- IOS 序列化与反序列化NSKeyedUnarchiver
开篇 1到底这个序列化有何作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中. 当你写的 ...
- footer置底
html代码: <div class="container"> <div cass="header"></div> < ...
- 开发者调试工具Chrome Workspace
Workspace是个什么样的东西呢?他能够在开发者工具中调试修改js或者css同时自动保存文件,能够避免开发人员在工具中调试好,再到编辑器中修改一次代码的重复操作,能够提高一定的效率 配置Chrom ...
- Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作
Oracle中对数据对象和数据的管理,无疑都是使用PL/SQL Developer来进行管理,该工具也提供给我们很多方便.快捷的操作,使得我们不再为Oracle本身丑陋.难用的UI而抱怨.由于我们一般 ...
- [转载]Linux 线程实现机制分析
本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 从零自学Hadoop(01):认识Hadoop
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 序 Hadoop 项目起源 优点 核心 ...
- 使用Java实现简单串口通信
最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...
- Linux下查找文件:which、whereis、locate、find 命令的区别
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索.which 查看可执行文件的位置,通过环境变量查whereis 查看文件的位置,通过数据库查,每 ...
- shell 判断语句
1.字符串判断 str1 = str2 当两个串有相同内容.长度时为真str1 != str2 当串str1和str2不等时为真-n str1 当串的长度大于0时为真(串非空)-z str1 当串的长 ...