zoukankan      html  css  js  c++  java
  • 安卓项目包命名规范及常见项目架构

        在Java中我们通常把具备相同或相似功能的一些类放在同一个包中,当然 不同公司会有不同的命名方式,但大体都相同,一个好的命名应见名知义,提高代码可读性,以利于后期代码的修改与维护。下面基于我自己做项目中的一些感触谈谈自己对包命名规范的理解。

    一Java包命名规范

    1)包(packages): 采用反写域名命名规则,即com.xx.xxx.xxxx形式
         全部使用小写字母。一级包名为com,二级包名为xx(一般为公司或个人域名),三级包名根据应用进行命名,四级包名为功能模块名。如:com.tencent.qq.activitys,这样具备较高可读性,一看就知道是腾讯公司QQ软件中存放activity的包。
    下面是一些常见的包命名组织方式。
    com.example.app.activitys  用来组织Activity类
    com.example.app.base 基础共享的类,如多个Activity共享的
    BaseActivity或整个应用共享的MyApplication类
    com.example.app.adapter 项目中用到的适配器类
    com.example.app.view 自定义的View,如常用的TitleBarView
    com.example.app.util 工具类,如HttpUtil,ImageUtil,FileUtil
    com.example.app.db 数据库类,如DataBaseHelper,MessageDB
    com.example.app.service 服务类,如GetMsgService
    com.example.app.constant 常量类
    com.example.app.domain/modle/entity 元素实体类,如对应注册用户信息的User类,
    对应聊天信息的TextMessage类
    com.example.app.broadcast 广播服务类
    2)资源布局文件(XML文件(layout布局文件)):全部小写,采用下划线命名,我一般按照组件名_功能名_属性名方式
    如:activity_login,fragment_constact_child.这样当你在Activity的onCreate中使用R.layout.的时候就只需筛选activity开头的xml文件,在Fragment的onCreateView中使用R.layout.的时候就只需筛选fragment开头的xml文件,这样就可以缩小聚焦范围,而且这样的命名具备较高的可读性,很容易知道fragment_constact_child表示某个ConstactFragment类中的child视图。
    3)控件:全部小写,采用下划线命名,我一般按照布局文件名_控件名_功能名_属性名方式(前面的布局文件名可选可不选,选的话具备较高的可读性)
    如:fragment_constact_child_img_avatar表示fragment_constact_child布局文件中的用户头像的ImageView。

    二常见项目框架

    无论是用移动客户端还是PC端的项目,一般都包括三个模块:用户交互层,业务逻辑层,数据持久层
    1)用户交互层:呈现给用户的界面模块,应考虑界面性能的高低
              因为要考虑良好的用户体验,所以必须考虑流畅度,让用户在使用App的时候不能感到卡顿
              如:在重新加载某个控件时先判断先前该控件的实例是否存在,若存在直接返回,不存在再创建。
      如在ExpandableListView的ExpandableListAdapter的getChildView代码如下:
    <span>		</span>public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
    				// TODO Auto-generated method stub
    				
    				GroupHolder holder = null;
    				if (convertView == null) {
    					convertView = LayoutInflater.from(mContext).inflate(
    							R.layout.fragment_constact_child, null);
    					holder = new GroupHolder();
    					holder.nameView = (TextView) convertView
    							.findViewById(R.id.contact_list_item_name);
    					holder.feelView = (TextView) convertView
    							.findViewById(R.id.cpntact_list_item_state);
    					holder.iconView = (ImageView) convertView.findViewById(R.id.icon);
    					convertView.setTag(holder);
    				} else {
    					holder = (GroupHolder) convertView.getTag();
    				}
    				
    				holder.iconView.setImageResource(R.drawable.head);
    				holder.nameView.setText(getChild(groupPosition, childPosition)
    						.toString());
    				holder.feelView.setText(signString[groupPosition][childPosition]);
    				return convertView;
    			}


    2)业务逻辑层:整个项目的核心,不仅仅要考虑功能的实现,还应考虑性能的高低
    在功能上就没啥好说,因为不同App一般要实现的功能不同,在性能上一般可以考虑一下几个层面:
    2.1)多线程:这个在网络请求中用的比较多。
    可以使用线程池,AsyncTask类,Thread+Handler异步消息机制或其它一些比较好的第三方开源库。
    2.2)内存:这个主要是图片处理及缓存

    1. 加载大图片时,合理设置BitmapFactory.Options的值inSampleSize,减少图片内存占用;

    2. 仅请求图片的大小,inJustDecodeBounds = true仅请求图片大小,而不会加载图片到内存;

    3. 缓存图片:内存缓存使用lruCache,磁盘缓存使用 DiskLruCache

    4. 使用非UI线程加载图片,使用 AsyncTask

    5. 使用软引用SoftReference

    3)数据持久层:这个一般用来保存用户的信息,磁盘文件及数据库文件
     这三层图示如下:



  • 相关阅读:
    2020牛客多校第三场 G
    Travel Guide
    jQuery属性选择器中加变量
    css 两大特性:继承性和层叠性
    css 伪元素选择器
    css 伪类选择器
    css属性选择器
    css的高级选择器,后代选择器,子代选择器,并集选择器,交集选择器
    css 引入方式以及css的选择器
    HTML
  • 原文地址:https://www.cnblogs.com/hainange/p/6334099.html
Copyright © 2011-2022 走看看