Android开发中遇到的一些疑难杂症

Android 开发中遇到的一些疑难杂症收集。
不断收集中


打开一个activity出现黑屏

  • 导致原因:
    • 打开的那个activity的onCreate方法中执行了耗时操作,导致延时执行界面绘制。
  • 解决方案:
    • 延时操作 作延时处理,或者干掉。再或者,给个activity设置一个过渡主题。

ViewHolder 出现重叠现象

  • 导致原因:
    • ViewHolder 复用逻辑问题。
  • 隐藏因素:
    • ViewHolder 内部有的有回调,有的无。有回调绑定过的ViewHolder再给无回调的数据绑定,会再执行回调中的逻辑,这真的是个隐藏的坑。
  • 解决方案:
    • 没有万能解决方案,视情况修改,需要特别注意回调问题。

EditText的IndexOutOfBoundsException

EditText.setSelection(str.length());

  • 导致原因
    • EditText的maxLength属性赋值了,str.length()大于maxLength

ANR 相关

  • log 日志的抓取
1
2
3
4
5
6
7
1、adb shell 

2、cat /data/anr/traces.txt >/mnt/sdcard/zz.txt

3exit

4、adb pull /mnt/sdcard/zz.txt d: ,即可将文件导出到了d盘。
  • debug 查看线程正在执行的方法,获取此时卡在什么地方
1
2
3
4
1、 启动 debug
2、 需要查看的时机,点击Debug窗口的Pause
3、 查看详细信息,点击Debug窗口的get Thread dump
4、 查看关键字main相关的主线程信息。

集成android-apt,报警告解决方法

  • 出现问题时的警告:
    • Warning:Using incompatible plugins for the annotation processing: android-apt.This may result in an unexpected behavior.
  • 原因:
    • Android Studio2.3版本,集成dagger,butterknife,使用以前的依赖方式android-apt
  • 解决方法:
    • 直接删除classpath’com.neenbedankt.gradle.plugins:android-apt:1.8’和applyplugin:’android-apt’,然后将apt替换为annotationProcessor

Dialog宽度不能MATCH_PARENT

解决方案:

1
2
3
4
5
6
7
 dialog.show();
//在dialog show方法调用之后设置对应的Window宽度为MATCH_PARENT。
WindowManager.LayoutParams layoutParams = dialog.getWindow().getAttributes();
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
dialog.getWindow().getDecorView().setPadding(0, 0, 0, 0);
dialog.getWindow().setAttributes(layoutParams);

Incorrectly nested parentheses in regexp pattern near index …

  • 出现了异常原因:Incorrectly nested parentheses in regexp pattern near index 5,
    大致意思是“在索引5位置附近发现括号嵌套的语法

  • 解决方案

    1
    2
    3
    String patten = Pattern.quote("" + keyWord);
    Pattern p = Pattern.compile(patten);
    Matcher m = p.matcher(str);

okhttp post 重定向参数丢失 不支持跨协议重定向

  • 问题:
    • 如果遇到301,302等重定向,则会忽略原来的请求方式,统一使用GET方式。如果原来使用的是POST方式,则会丢失参数。
    • okhttp源码中不支持跨协议重定向。
  • 解决:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class RedirectInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();
    HttpUrl beforeUrl = request.url();
    Response response = chain.proceed(request);
    HttpUrl afterUrl = response.request().url();
    //根据url判断是否重定向
    if(!beforeUrl.equals(afterUrl)) {
    //处理两种情况 1、跨协议 2、原先不是GET请求。
    if (!beforeUrl.scheme().equals(afterUrl.scheme())||!request.method().equals("GET")) {
    //重新请求
    Request newRequest = request.newBuilder().url(response.request().url()).build();
    response = chain.proceed(newRequest);
    }
    }
    return response;
    }
    }
  • 相关参考

AndroidStudio编译错误

错误1

  • 错误信息:
    • Error: null value in entry: blameLogFolder=null
  • 解决:
    • 这是gradle的一个bug,删除项目根目录下的.gradle目录,重新编译下一就可以了

错误2

  • 错误信息:
    • Error: No service of type Factory available in ProjectScopeServices.
  • 解决:
    • 这是升级AS之后引发的,版本对应不上,修改build.gradle文件如下即可
      1
      2
      3
      4
      //旧
      'classpath com.github.dcendents:android-maven-gradle-plugin:1.3'
      //新替换旧
      'com.github.dcendents:android-maven-gradle-plugin:1.4.1'//总之用新版就好

错误3

  • 错误信息:
    • Caused by: java.lang.ClassNotFoundException: Didn’t find class “android.support.v4.animation.AnimatorCompatHelper”
  • 解决:
    • 这一般是引入了多个三方库,版本不统一导致的,在build.gradle添加如下代码,统一版本号即可
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      	configurations.all {
      resolutionStrategy.eachDependency { DependencyResolveDetails details ->
      def requested = details.requested
      if (requested.group == 'com.android.support') {
      if (!requested.name.startsWith("multidex")) {
      details.useVersion '26.0.2'
      }
      }
      }
      ~~~

      ### 错误4
      * 错误信息:
      * Maven 项目构建失败“文件名、目录名或卷标语法不正确”
      * 解决:
      * 比如 compile files('libs/:BaiduLBS_Android.jar') 配置中多了“:” 需注意检查目录配置是否正确,主要是依赖导入这

      ### 错误5
      * 错误信息
      * too many padding sections on bottom border.
      * 解决
      * 点9图处理失败,一般只需要左边和上面处理就行了。

      ### 错误5
      * 错误信息
      * INSTALL_PARSE_FAILED_NOT_APK由于以下原因导致安装失败:Android Studio 3.5
      * 解决:
      * 需要开启V1 和 V2签名
      ~~~gradle
      v1SigningEnabled true
      v2SigningEnabled true

打开系统设置崩溃

  • 错误信息
    • Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
  • 解决
    • 从一个Activity中要通过intent调出另一个Activity的话,需要使用 FLAG_ACTIVITY_NEW_TASK
    • 如果调出的Activtivity只是一个功能片段,并没有实际的意义,也没有必要出现在长按Home键调出最近使用过的程序类表中,那么使用FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
      Intent intent = new Intent(this, WaitingFallBackDialog.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
      startActivity(intent); 

注意事项

  • app打开第一个界面后,直接返回关闭第一个界面,可能存在Application 未完全退出的情况,潜伏bug。

android studio 3.5 格式化xml文件 错乱问题

问题:android studio3.5,发现一个大问题xml只要一按ctrl+alt+L格式化代码整个布局文件就错乱顺序了。

解决办法:打开setting界面 找到 set from 点击 predefined style 选择 Android 最后 apply 选择 ok