让你Android开发更简单

转载: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
时间: 2024-10-07 23:25:06

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

Android开发---MediaPlayer简单音乐播放器

Android开发-MediaPlayer简单音乐播放器 功能介绍 实现一个简单的播放器,类似网易云音乐形式,功能包括: 播放.暂停,停止,退出功能: 后台播放功能: 进度条显示播放进度.拖动进度条改变进度功能: 播放时图片旋转,显示当前播放时间功能: 界面样式 功能实现 1. MediaPlayer的实现 MediaPlayer常用方法介绍 MediaPlayer的实现包括初始化MediaPlayer,MediaPlayer的功能实现,包括播放.暂停.停止.离开等,具体细节如下: MediaP

云如何让App开发更简单?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 互联网"下半场",移动App开发对于质量.速度的要求更加苛刻.4月初,腾讯云正式上线移动开发平台MobileLine,借助腾讯在移动应用开发领域的成熟积累,帮助移动开发者低成本.快速的构建弹性.高质量的精品应用. 短短几天,就有几百个移动开发者申请接入使用. 一.简单.高效才是王道,腾讯内部移动开发百花齐放 腾讯一直积极拥抱移动互联网,打造了众多的精品应用.实际上,对于支撑移动开发的各种服务,腾讯内部也是百花齐放,比如移动分析

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

今天,我们很高兴地宣布 Coding Enterprise 发布了 -- Coding Enterprise 是 CODING 专为企业打造的软件开发协作平台,提供了针对中小型企业的公有云版本和针对大型企业的私有云版本,功能覆盖所有的开发场景,可以帮助企业更高效便捷地进行开发协作,真正实现一站式开发. 简单易用,安全高效 CODING 团队拥有 3 年多的互联网平台级产品开发和运营经验,旗下 Coding.net 云端软件开发协作平台已积累了 35 万多名的用户及 60 万多个项目,包括 Lin

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

日前,业内率先的APP开发平台运营商中兴应用之星与中国电信天翼开放平台达成战略合作.即广大用户通过天翼开放平台,可直接享受到应用之星提供的"APP开发服务". 应用之星.中兴通讯旗下优势品牌.多年来致力于APP开发.为用户搭建免费的在线应用开发平台.迄今,应用之星已为开发人员生成三万多款应用.为开发人员与普通用户创造巨大价值! 不懂技术,不会编程.也能高效便捷地制作APP,是应用之星的最大优势.近年来,移动互联网的发展如火如荼.为自己.为公司开发一款手机APP成为大众所需. 然后,技术

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

在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vysor Vysor 是一个可以将手机的屏幕投影到电脑上,当然也可以操作,当我们做分享或者演示的时候,这个工具起到了作用. Vector Asset Android Studio 在1.4 支持了VectorAsset,所谓VectorAsset:它可以帮助你在Android 项目中添加Materia

Android开发布局简单介绍

Android开发布局介绍 1.线性布局 LinearLayout 布局中的组件会一个挨着一个排列起来,android:orientation属性可以控制排列方向,horizontal-水平.vertical-垂直 线性布局不会自动换行,当超出屏幕范围时,剩下的组件不会显示出来. 2.表格布局 TableLayout 继承自LinearLayout,其本质依然是LinearLayout.通过TableRow来管理表格的行数和列数.添加一个TableRow就是一行. 3.帧布局 FrameLayo

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

文/腾讯优测工程师  吴宇焕 腾讯优测优社区干货精选~ 相信开发同学都被安卓设备碎片化的问题折磨过,市面上安卓手机的主流屏幕尺寸种类繁多,给适配造成很大的困难.就算搞定了屏幕尺寸问题,各种分辨率又让人眼花缭乱,当你走出了前面所说的两大坑,很有可能又掉进"屏幕长宽比不同"的陷阱... 说多了都是泪,我就想做一名安静的开发怎么这么难? 经历过无数次跌跌撞撞,我总结出一些经验,想与大家一起分享.已知的屏幕适配方法:(1)按像素比:y/开发时用的屏幕像素=x/用户设备像素(2)按长度:用dip

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

各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大家一起交流的内容是在Unity3D游戏开发中使用SQLite进行数据库开发.坦白来讲,在我的技术体系中Web和数据库是相对薄弱的两个部分.因此正好这段时间项目须要和server.数据库进行交互,因此在接下来的文章中博主可能会更加倾向于解说这方面的内容,希望大家能够喜欢啊! 一.什么是SQLite?

Android开发之简单的聊天室(客户端与服务器进行通信)

1.使用ServerSocket创建TCP服务器端 Java中能接收其他通信实体连接请求的类是ServerSocket, ServerSocket对象用于监听来 自客户端的Socket连接,如果没有连接,它将一直处于等待状态.ServerSocket包含一个监听来自客户端连接请求的方法. 1) Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与连接客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞. 创建ServerSoc