Androidandroid其他

《App研发录》知识点汇总

2016-07-23  本文已影响2927人  Jinwong

�《App研发录》这部书是包建强写的,说来也巧,在读这边书之前在看池建强的《Mac 人生元编程》 ,所以读这本书的时候,将这两个建强搞混。这本书花了我一周多一点的时间看完。昨天晚看完久久不能寐,一是惊叹这本书的干货太多,这本书不同于市面上其他的Android 教程,给你讲一堆API方法,Android 基础,作者从一个APP团队的负责人的角度高屋建瓴的讲解App框架设计,Bug收集汇总分析,团队建设,项目管理等等方面,而且都是非常适合APP的项目管理者的实在的经验。二是敬佩作者进入Android 领域也不是很久,但是见解非凡,经验老道,感到自己做Android 也快两年了,为啥还达到没有作者的一半高度。唉,看来自己之前的两年过得太轻松了,每天混混日子,自以为懂些Android 技术,能实现产品交代的功能,就得过且过,没有好好的利用好时间,认真学习,加速成长。

题外话太多了,自己觉得有些东西是多余的,是自己的无病呻吟,各位看官,可以忽略不看,直接看下面的干货。


APP 框架

1. 项目结构

非常赞同作者的观点,我们App必须具有良好的包结构,按照一定规则将不同的类放到不同的地方,目前市面上有两者结构,一种是按照类的类型进行归纳放置,例如Activity 类放一起,adapter 放一起,以此类推;另外一种是按照业务逻辑,例如主页页面逻辑放在一个小包中,用户信息逻辑放在一个小包中,当然小包中可以再分包。
两种都可以,但必须具有一致项目结构,不要弄得不三不四,类到处放,没有一定规则

2. baseActivity、BaseAdapter基类管理

3. 网络框架,封装好网络层。

不要使用AsyTask,因为他在4.x 版本中是串行,效率不高,而且当请求线程数达到AsyTask上线时会有问题。建议用TheadPoolExecutor+Runnable+Handler 的方式进行封装。
统一预处理成功及失败回掉,

4. 数据缓存策略:

为减少请求网络数据次数,有必要进行数据缓存,将请求网络的数据,缓存在手机上,为保证数据即时性,设置缓存时间,而且可以根据业务需求对不同数据设置不同的缓存时间,有的数据不咋改变可以设置长些时间,有些数据经常变动,对即时性要求比较高,缓存时间设置短些,设置可以不设置缓存。
另外必须有接口能够让用户强制更新数据,例如用户下来刷新,就不要使用缓存中数据,而是直接请求最新的网络数据

5. 用户登录

    //起始页面,可能需要跳转登录注册页
    if(User.isLogin()){
         //do something
        }else{
    Intent intent=new Intent(this,LoginActivity.class){
    intent.putExtra(AppConstant.NeedCallback,true);
    startActivityForResult(intent,LOGIN_REDIEECT_INSIDE);
        }
    }

@Override
public void onActivityResult(int requestCode, int resultCode,Intent data){
    if(resultCode!=Activity.RESULT_OK){
        return;
      }
    swith(requestCode){
       case LOGIN_REDIEECT_INSIDE:
           //  do something
            break;
       default:
       break;
    }
}

//登录页面 LoginActivity
if(getIntent.getBooleanExtra(AppConstant.NeedCallback){
    setResult(Activity.RESULT_OK);
    finish();
}ese{
   //do otherthing
}

6. 防止黑客刷库

7. 时间校准问题

如果后台或者用户端对时间准确性要求比较高的话,需要考虑这个问题。因为我们用户手机上的时间不是非常准确,一般都有一定的偏差。作者建议后台采用UTC时间,包括入参和返回值,返回值为long类型。客户端根据得到的UTC时间换算成本地时间。如果需要用户传给后台准确的时间,这是个大问题。用户那边其实很难得到比较准确的时间,除了用户时区问题,另外还有与准确时间偏差问题。可以用户的时间传给后台,后台比对差值,然后每次不停的比对减少误差,最后找到一个准确值。

8. gzip 压缩

一般http采用gzip压缩,减少传输量,缩短传输时间。但是在HttpRespose 需要判断content-encoding字段中是否有gzip,判断后台是否经过gzip压缩。

9. Freso的三级缓存

第一层:Bitmap 缓存
在Android 5.0中,考虑内存管理有了很大的进步,所以讲Bitmap 缓存在Java堆中,在之前版本中Bitmap缓存在ashmen中,当app切换到后台时,Bitmap缓存将会被清空
第二层:内存缓存
内层缓存中存储了图片原始压缩的格式,从内层缓存中取出图片,在显示之前必须进行解码。当app切换到后台,内存缓存也被清空
第三层:磁盘缓存,也叫本地缓存
本地存储图片原始压缩格式,显示之前也需先解码,当app切换后台,磁盘缓存不会丢失。

10. 流量优化

11.增量更新

app中的资料包,城市列表等素材可以使用增量更新。每次发版素材保证是最新的版本,当有更新时,首先对比本地素材版本号与线上素材版本号,后台根据他们版本号返回对应的更新内容。客户端收到后解压。增量更新的内容有三部分:需要删除的数据、不变的数据但是需要修改、新增的数据,用户根据情况各自处理

12. Html 互换技术

当我们的app原生页面遇到bug,可以马上切换到Html页面替换。

Crash及持续集成

1. Crash 的收集

收集的渠道

2.Crash经验

  1. 窗体泄露问题,主要是想关闭弹出框时,他所承载的activity 不在了,而activity关闭了,没有及时dismiss会导致泄露窗口句柄,不要在子线程操作对话框,另外让对话框是Activity成员变量,活跃在onCreate()和onDestroy()两个方法之间,或者建议使用DialogFragment。
  2. 只有activity 才能添加窗体,传给Dialog的Context 要为activity。
  3. 不要相信api 返回数据,必须做非空判断,类型异常等容错处理
  4. 遍历集合时不能删除集合中数据,否则发生崩溃。另外多个线程同时操作同一集合数据也可能会发生崩溃
  5. 当Service或者BroadcastReceiver等中当context 为非activity 跳转activity需要加Intent.FLAG_ACITIVITY_NEW_TASK
  6. 当fragment还没有attach 到activity中调用getResource().getString()会报错,建议在调用之前加上isAdd()判断
  7. Parcelable 反序列化时,例如a=in.readParcelable(null)会可能抛出BadParcelabeException:ClassNotFoundException when unmarshalling...改成这样就行a=in.readParcelable(A.class.getClassLoader)
  8. List<T> 没有实现add()、remove()方法, 使用这两个方法会抛异常,特别注意Arrays.asLis() 返回的是List<T>,而不是ArrayList();
  9. 只要修改了adapter中的集合的数据,就要马上调用notifyDataSetChanged方法,以保证列表同步更新,否则崩溃。
  10. ListView滚动式点击刷新按钮后会崩溃,因为之前getCount还有数据,滚动时刷新数据集合就清掉了,getView 中数据为空,报数据越界等异常,一般解决方案是,滚动时,禁止刷新。
  11. PopupWindow创建后才能再调用setFocusable() 方法。
  12. PopupWindow.showLocation(view parent,int gravity,in x,int y),当参数parent 为空时,报Unable to add Windowtoken,因为popupWindow要依附activity,activity还没有onCreate()执行完,就会报此错误。
  13. armeabi 和armeabi-v7a中so包数量不一致,会导致UnsatisfiedLinkError。
  14. SQLite 支持单线程、多线程、串行三种模式。但是多线程中使用单个数据库连接不是安全的,当一个线程写数据,一个在删数据会抛I/O 异常,当一个操作完关闭数据库,另外一个还在操作也会导致Crash。
  15. <application android:largeHeap="true"可以增加系统为当前app 分配内存,甚至能到达100M以上,但是每次GC 时间会延长,性能会下降。
  16. WebView中存在两种缓存:网页数据缓存,存储打开过的页面及资源;Html5缓存,及appCache。WebView自带的缓存机制,会将url保存在webviewCashe.db中,将url内容保存在webViewCashe文件夹下,网页数据图片、html、js等文件也会存储起来

ProGuard

ProGuard一共包含以下4个功能:

竞品分析

1. 竞品app分析方向(针对技术):

2. 优化措施

上一篇 下一篇

猜你喜欢

热点阅读