开发APP中遇到的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caiwenfeng_for_23/article/details/51598635

这篇博文主要是记录下自己日常开发中遇到的一些坑,以及相应的解决解决方案,权当自己的笔记,如有兄弟遇到类似的问题,欢迎交流。

1 Activity之间跳转的生命周期问题 :
背景 :有两个Activity A和B,A跳转到B,全局静态属性BitmapUtil.drr记录了文件的路径数据;A跳转到B时,A在onDestroy里清空drr数据,请问B在onCreate方法和onResume方法里读取到的drr数据是不是为空?

测试结果:A跳转到B, A在onDestroy里清空了BitmapUtil.drr数据,导致在B的onCreate方法读取drr数据不为空,但onResume方法中读取的drr数据为空;

2. 视频播放全屏底部白条问题 : 自己调整布局 以及设置 正确的参数 :
surface_view.getHolder().setFixedSize(mSurfaceViewWidth, mSurfaceViewHeight);

3. 代码设置TextView的字体大小 :记住默认是以SP为单位的,所以不用再转px了。

4. setOnScrollListener 滑动监听: ListView第一次初始化就会调用onScroll方法,坑啊

 //滚动监听
  pull_list_grid.setOnScrollListener(new AbsListView.OnScrollListener() {
   @Override
   public void onScrollStateChanged(AbsListView view, int scrollState) {

   }

   @Override
   public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//                Logger.e("firstVisibleItem::" + firstVisibleItem + " visibleItemCount :" +visibleItemCount +"  totalItemCount :"+totalItemCount);
    if (!TextUtils.isEmpty(keyword)&&!noMoreData && totalItemCount - firstVisibleItem < CommConfig.LetterLoadMore_SIZE && !httpIng) {
     getMorePage();
    }
   }
  });

5 postDelayed 方法中运行的Runable是主线程调了Runnable的run方法而已,细节忘了。。。。

postDelayed(new Runnable() {

@Override
public void run() {
}
},1000);

6. TextView要setMovementMethod(LinkMovementMethod.getInstance());//不设置 ClickableSpan没有点击事件

7. 设置 android:allowBackup=”false” 这个属性存在bug,模式是true,在正式发布app的时候设置为false,但一般项目引用多个第三方库的时候,会存在坑多个冲突,导致打包APP失败,查看日志也找到了google给出的建议,如下:

 Suggestion: add 'tools:replace="android:allowBackup"' to <application> element at AndroidManifest.xml:89:5-1052:19 to override.

所以添加 :

tools:replace="android:allowBackup"

8.使用优测,发现一些安全漏洞和一些bug 但TM按照给出的修改建议,修改bug后,再测试还是有相同的漏洞,表示很坑啊。。。。

9.TextView 同时显示表情和文字, 可能存在表情被遮挡部分或者文字表情不居中显示bug, 操蛋,这个调试了好久,尝试过设置表情大小,文字大小,发现都不能根本解决问题,调试好久, 最终发现设置TextView的高度为wrap_content是不行的,要设置为相应的高度值 ,比如20dp 就OK了

10.自定义属性和support:appcompat-v7:22.2.0包属性冲突 : 根本的解决方法都是更改自定义控件的属性,但因为我的项目中大量使用了这个控件,因为项目紧张, 所以找了一个暂时的解决方法

    <attr name="title" format="string" />
    <attr name="titleTextSize" format="dimension" />
    <attr name="titleTextColor" format="color" />
    <attr name="title" />
    <attr name="titleTextSize"/>
    <attr name="titleTextColor"/>

最后,我抽空写了一个java程序,修改了所有使用这个控件的属性方法,从源头解决方法

11. APP启动显示默认的启动页面(跟微信类似) : 关键代码 android:theme=”@style/AppSplash”

<!--启动页面-->
        <activity
            android:name=".activity.login.SplashActivity_"
            android:theme="@style/AppSplash">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


            <!--启动页面主题   可以自己定制 -->
        <style name="AppSplash" parent="android:Theme">
            <item name="android:windowBackground">@drawable/splash_bg</item>
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowFullscreen">true</item>
        </style>

12. Android 开发的时候在Application开启 严格模式,会查找到很多问题代码:


  /**
  * 严格模式开启一
  */
 private void setStrictMode() {
  if (LogUtil.isDebug && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD_MR1) {
   StrictMode.enableDefaults();
      }
 }

/**
* 严格模式二
*/
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
         .detectLeakedSqlLiteObjects() //检查SQLiteCursor泄漏
         .detectLeakedClosableObjects() //检查所有继承java.io.Closeable泄漏:如流没有关闭
         .detectActivityLeaks() //检查Activity泄漏
         .penaltyLog() //检测到问题时,将日志输出到Logcat
//                    .penaltyDeath() //检测到问题时,直接崩溃
         .build());

13. butterknife 插件使用: 鼠标点到R.layout.activity_main布局 ,再右键Generate–》ButterKnife 选项

14. MuritaleDex :这个是65536的问题,APP项目功能越来越多,引用越来越多第三方的Jar包的时候,就有很大的概率触发这个问题。Android5.0以上的系统,不需要担心这个问题。

compile 'com.android.support:multidex:1.0.1'//引用multidex库

15. leak canary 内存泄漏检测工具 :下面这段代码这能放在项目APP的build文件中,而不能放在任何第三放的aar的build文件中。

  //leak canary  内存泄漏检测工具
    //https://github.com/square/leakcanary
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'

LeakCanary工作原理
•RefWatcher.watch()创建一个KeyedWeakReference到监控的对象。
•接下来,在后台线程中检测这个引用是否被清除,如果没有将会触发GC。
•如果引用仍然没有清除,将heap内存dump到一个.hprof的文件存放到手机系统里。
•HeapAnalyzerService在另外一个独立的进程中启动,使用HeapAnalyzer解析heap内存通过HAHA这个项目
•HeapAnalyzer计算出到GC ROOTs的最短强引用路径决定是否发生Leak,然后建立导致泄漏的引用链。 结果被回传到应用程序进程的DisplayLeakService中,然后显示一个泄漏的通知。

16 . Android高级开发之性能优化典范 值得一看 ,开发规范很重要

17 . LinearLayout中设置android:orientation=”horizontal” ,它的高度以第一个view的高度为准,导致高度不对,解决方法: 在第一个View的外层添加一个LinearLayout ,设置高度为 android:layout_height=”match_parent”

18.multidex引发的后遗症, 当修改MAinActivity的FindFragment为InfoFragment时,分包Dex包中不存在InfoFragment类,其实是因为手机上的dex是旧的dex包,导致没有更新所致,解决方法是删除掉手机上的APP,然后Clean一下AS工具,重新安装App即可

猜你喜欢

转载自blog.csdn.net/caiwenfeng_for_23/article/details/51598635