Android奇葩说

版权声明:本文为博主原创文章,转载需注明博主文章链接。 https://blog.csdn.net/black_bread/article/details/76764335

You need to use a Theme.AppCompat theme (or descendant) with this activity.

Exception log:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:310)
at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:279)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:253)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)

Common solution:

  • Activity extends AppCompatActivity
  • Activity apply style theme (Theme.AppCompat(or descendant))

奇葩说

common solution根本不奏效,最后改了version code、version name,。。。没问题了,wtf

奇葩重现

  • 集成sophix热修复,打包,当前版本1.0.0 — test-1.0.0.apk(bug版本)
  • 修复bug,发布1.0.0补丁
  • 不更改version code、version name,接着开发,打包,当前版本1.0.0 — fix-1.0.0.apk(稳定版)
  • 这是基本上是稳定复现bug

奇葩解说

  • 比对两个版本apk差别在于一个修复bug,一个没修复bug
  • 没有修复的版本正常,修复的版本不正常
  • 没有修复的版本加载补丁后,正常修复bug;修复的版本因为还是1.0.0版本所以还是会加载补丁,加载补丁干嘛用?用来修复,可是bug已经修复了,所以导致activity异常

Recyclerview 嵌套 Recyclerview 导致下拉卡顿释放正常

Exception log:

Common solution:

  • 通常是由滑动冲突造成,所以关键还是在于怎么解决滑动冲突,网上很多什么继承RecyclerView,重写dispatchTouchEvent等等,这边就不多解释了
  • 现在compat的view基本上都解决了滑动冲突的问题,所以很可能就没这个问题,具体还得看你的compat包是什么版本的

奇葩说

同样的common solution根本不奏效,最后给子RecyclerView设置了recyclerView.setFocusable(false);,居然可以了,我什么也没干 →_→

奇葩重现

  • 可下拉刷新的recyclerview 嵌套recyclerview

奇葩解说

  • 有点不好解释。。下拉刷新时,经过调试发现,其实下拉刷新的布局高度是有改变的,但是效果不见了
  • 观察下拉时有一小段高度不是完全没有,由此可见,是子recyclerview抢走了父recyclerview的事件
  • 下拉刷新的时候,人为都做了哪些操作,click、focus、touch down、 touch move,关键在于focus和touch move
  • 尝试更改子recyclerview的focus,你会发现setFoucsable(false)解决了这个问题
  • 有的时候知其然就可,因为讲的太啰嗦了。。 要想知其所以然,可以去看看dispatchTouchEvent和onTouchEvent方法╰( ̄▽ ̄)╮

CardView圆角效果失效

Exception log:

Common solution:

  • 硬件加速关闭,导致不显示圆角效果,将android:hardwareAccelerated=”false”移除

奇葩说

原项目,使用cardview切圆角,布局代码

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:cardCornerRadius="100dp">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:src="@drawable/test_thumb"/>
    </android.support.v7.widget.CardView>

效果:

新建项目,布局增加代码

效果:

奇葩重现

  • 全局添加android:hardwareAccelerated=”true”

手机没有日志无法打印

Exception log:

Common solution:

  • adb kill-server adb start-server 关闭重启adb服务
  • 卸载手机助手之类的软件,然后重启服务
  • 选中对应手机设备

奇葩说

华为手机只打印部分系统日志,应用日志都不打印/只打印某些级别的日志

奇葩重现

  • 在测试菜单中关闭LOG级别的日志

奇葩解说

  • 由于华为系统默认关闭Log.d及以下的日志
  • 解决方案:
    1. 在拨号界面输入:##2846579## 进入测试菜单界面。
    2. Project Menu–后台设置–LOG设置
    3. LOG开关–LOG打开 LOG级别设置–VERBOSE
    4. Dump&Log– 全部选中
    5. 重启手机(这一步不一定要做)

科大讯飞语音 — Signal 11(SIGSEGV),code 1(SEGV_MAPERR)fault addr 0xcb74000

Exception log:

Signal 11(SIGSEGV),code 1(SEGV_MAPERR)fault addr 0xcb74000

Common solution:

if (mTts.isSpeaking()) {
    mTts.destroy();
}

奇葩说

  • 由于调用destory方法后,会导致不稳定crash并不是每次都crash

奇葩重现

  • 开启语音,等待语音读完,关闭页面并调用mTts.destroy();

奇葩解说

  • 这是科大讯飞的1101和1102版本中存在的问题,更换版本即可(1111及以上版本已经解决这个问题)

使用Activity.setRequestedOrientation(int requestedOrientation)方法旋转屏幕严重卡顿

Common solution:

在当前Activity的所有父Activity配置中,即AndroidMenifest.xml中,为所有的父Activity添加上
android:configChanges="orientation|screenSize|keyboardHidden"

奇葩重现

在父Activity的初始化业务中增加耗时操作

奇葩解说

先看setRequestOrientation方法源码

Activity mParent; //mParent 是Activity,且是Activity栈中的相对父Activity
    public void setRequestedOrientation(@ActivityInfo.ScreenOrientation int requestedOrientation) {
        if (mParent == null) { // 如果父Activity不存在,直接调用服务来控制旋转屏
            try {
                ActivityManager.getService().setRequestedOrientation(
                        mToken, requestedOrientation);
            } catch (RemoteException e) {
                // Empty
            }
        } else { // 如果父Activity存在,需递归调用setRequestedOrientation
            mParent.setRequestedOrientation(requestedOrientation);
        }
    }

从源码可以看出,最终调用的是根Activity的setRequestedOrientation方法;
由于旋转屏幕导致Activity会被重新实例化,所以需增加android:configChanges=”orientation|screenSize|keyboardHidden”配置
什么导致调用setRequestOrientation方法旋转屏幕卡顿?由于父Activity的初始化业务较重(想吐槽下老同事写的代码。。。。真心蛋疼),需花费一定时间去完成父Activity实例化,因此卡顿的原因在此

猜你喜欢

转载自blog.csdn.net/black_bread/article/details/76764335