开发APP中遇到的坑

来源:互联网 发布:可视化编程软件哪个好 编辑:程序博客网 时间:2024/05/09 14:52

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

  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();    }   }  });
  1. postDelayed 方法中运行的Runable是主线程调了Runnable的run方法而已,细节忘了,坑。。。。

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

  2. 更新umeng : 从4.6升级到5.0版 真的如官方所说,变化很大,很多api没有了 更新谨慎之

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

    Suggestion: add ‘tools:replace=”android:allowBackup”’ to 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程序,修改了所有使用这个控件的属性方法,从源头解决方法

  1. 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>
  1. Android 开发的时候在Application开启 严格模式,会查找到很多问题代码:
/**  * 严格模式开启  */ private void setStrictMode() {  if (LogUtil.isDebug && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD_MR1) {   StrictMode.enableDefaults();      } }
  1. butterknife 插件使用: 鼠标点到R.layout.activity_main布局 ,再右键Generate–》ButterKnife 选项

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

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

  3. 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即可

19.复制保留旧的XML布局文件,时间久了发现后面无法删除,查了好久都没发现什么问题导致,今天终于一点点删除XML布局文件的内容,删除到最后,发现有几个不能删除,一删除就编译错误,
查看最新的XML布局代码中,没有这几个内容,再看Activity中代码,发现在点击事件中,还留存着这几个Id,我擦,原来就是这个问题。

20 . 以后不要保留旧的XML文件 ,容易引发乱七八糟的bug,坑
21 . 融云刷新用户信息无效问题:
不能直接在你实现的类里异步请求更新userinfo,你看日志的会发现,其实融云根本没调用户接口请求,暂时没有去查原因,我的解决方法是通过EventBus消息传到MainActivity中再请求userinfo,然后更新userinfo,解决了更新用户信息的问题。

0 0
原创粉丝点击