当前位置: 萬仟网 > 移动技术>移动开发>Android > Android 常见bug汇总及解决方案

Android 常见bug汇总及解决方案

2021年03月24日  | 萬仟网移动技术  | 我要评论
作为开发人员,平时总会遇到各种各样的问题,之前都没有收集bug的习惯,遇到相同的问题总会有种莫名的熟悉感,或许把问题都汇总,方便查找,也可以给大家踩踩坑,后面会陆续更新补充!1、关于使用okhttp运

作为开发人员,平时总会遇到各种各样的问题,之前都没有收集bug的习惯,遇到相同的问题总会有种莫名的熟悉感,或许把问题都汇总,方便查找,也可以给大家踩踩坑,后面会陆续更新补充!

1、关于使用okhttp运行时出现的错误

报错如下:

static interface methods are only supported starting with android n (--min-api 24): 
okhttp3.request okhttp3.authenticator.lambda$static$0(okhttp3.route, okhttp3.response)

大概意思就是静态接口方法只从android n开始使用。

解决方案:

因为静态接口需要在java 8 下才支持使用,所以我们要使用静态接口,就需要在app的build.gradle文件中配置声明,使用java 8编译。

所以需要加入以下代码来声明:

 compileoptions {

  sourcecompatibility javaversion.version_1_8

  targetcompatibility javaversion.version_1_8

 }

修改如下图所示:

添加完成以后,同步一下,然后重新运行项目就可以啦。

2、图片轮播控件com.youth.banner使用glide异步加载图片时发生的崩溃

错误信息:

java.lang.illegalargumentexception: you cannot start a load for a destroyed activity
 at com.b.a.e.m.b(requestmanagerretriever.java:311)
 at com.b.a.e.m.a(requestmanagerretriever.java:130)
 at com.b.a.e.m.a(requestmanagerretriever.java:114)
 at com.b.a.d.c(glide.java:697)
    at com.company.h5.c.ag$b.a(mainfragment.java:1079)
 at com.company.h5.c.ag$b.displayimage(mainfragment.java:1063)
 at com.youth.banner.banner.setimagelist(banner.java:354)
    at com.youth.banner.banner.start(banner.java:262)

根据错误信息找到发生闪退的代码位置:

 //自定义的图片加载器
 private class imgloader extends imageloader {
  @override
  public void displayimage(context context, object path, imageview imageview) {  
  roundedcorners roundedcorners = new roundedcorners(20);
   requestoptions options = new requestoptions().bitmaptransform(roundedcorners);
   //报错地方
   glide.with(context).load((string) path).apply(options).into(imageview);
  }
    }

跟踪日志进入glide调用的地方发现,出现在

requestmanagerretriever.assertnotdestroyed()

方法中:

 @targetapi(build.version_codes.jelly_bean_mr1)
 private static void assertnotdestroyed(activity activity) {
  if (build.version.sdk_int >= build.version_codes.jelly_bean_mr1 && activity.isdestroyed()) {
   throw new illegalargumentexception("you cannot start a load for a destroyed activity");
  }
    }

这个错误是使用glide异步加载图片的时候,activity已经destroyed

解决方案:

1、在使用glide加载图片前,先进行activity是否destroy的判断:

 /**
  * 判断activity是否destroy
  * @param activity
  * @return
  */
 public static boolean isdestroy(activity mactivity) {
  if (mactivity== null || mactivity.isfinishing() || (build.version.sdk_int >= build.version_codes.jelly_bean_mr1 && mactivity.isdestroyed())) {
   return true;
  } else {
   return false;
  }
    }

2、在错误的位置进行替换:

 //自定义的图片加载器
 private class imgloader extends imageloader {
  @override
  public void displayimage(context context, object path, imageview imageview) { 
   //添加判断 
   if(!isdestroy((activity)context)){
    roundedcorners roundedcorners = new roundedcorners(20);
    requestoptions options = new requestoptions().bitmaptransform(roundedcorners);
    glide.with(context).load((string) path).apply(options).into(imageview);
   }
  }
    }

这样就解决啦。

3、接入容联七陌客服系统,进入客服界面时闪退问题

错误信息:

图片看起来不清晰,看报错代码:

java.lang.nosuchmethoderror: no virtual method into (landroid/widget/imageview;)lcom/bumptech/glide/request/target/target; in class lcom/a/a/i; or its super classes (declaration of 'com.a.a.i' appears in/data/app/com.sami91sami.h5-1/base.apk)

我们可以根据报错,跳到报错的地方:

该报错的意思就是:没有 

into(landroid/widget/imageview)

的方法,代码能编译通过,说明项目中肯定是添加依赖了,那怎么还会报这个错误呢?还没添加依赖之前,项目中也是使用的glide进行图片的加载,会不会是项目中的glide与容联demo中的glide有冲突呢。

我们可以根据报错的地方into方法,点进入看源码:

可以看到容联demo使用的glide版本是3.7.0。

再来看看项目中glide使用的版本:

可以看到项目中使用的glide版本是4.5.0。

这时就想到真的很大概率是两者的glide版本有冲突了。

果然将容联demo中的glide版本改成4.5.0之后,编译运行进入客服界面后,没有报错了,完美解决。

4、android 7.0系统解决拍照的问题

报错信息:

# main(1)
android.os.fileuriexposedexception
file:///storage/emulated/0/xiangmu/3462884.jpg exposed beyond app through clipdata.item.geturi()

android.os.strictmode.onfileuriexposed(strictmode.java:1816)
android.net.uri.checkfileuriexposed(uri.java:2350)

解决方法如下:

1.在相对应的页面中,写如下的方法:

private void initphotoerror(){
  // android 7.0系统解决拍照的问题
  strictmode.vmpolicy.builder builder = new strictmode.vmpolicy.builder();
  strictmode.setvmpolicy(builder.build());
  builder.detectfileuriexposure();
    }

2.在oncreate中调用上述的方法。

5、使用recyclerview滑动闪退问题

错误信息:

图片看起来不清晰,看报错代码:

indexoutofboundsexception: inconsistency detected. invalid view holder adapter

看这个代码,只是并没有报到我们自己的代码里面来,在底层就崩溃了,在app层面并没有,弹出一个框,说应用程序已奔溃,而是直接就没了,用户感觉很奇怪。这种异常并不是很容易出现,而是偶尔出现,我的也是在后台奔溃日志中,发现了这种异常,我们自己都不知道什么地方报错的。

解决方案如下:

1、创建一个类linearlayoutmanagerwrapper

继承linearlayoutmanager,重写onlayoutchildren方法

public class wrapcontentlinearlayoutmanager extends linearlayoutmanager {
 public wrapcontentlinearlayoutmanager(context context) {
  super(context); 
 } 

 public wrapcontentlinearlayoutmanager(context context, int orientation, boolean reverselayout) { 
  super(context, orientation, reverselayout); 
 } 

 public wrapcontentlinearlayoutmanager(context context, attributeset attrs, int defstyleattr, int defstyleres) {
  super(context, attrs, defstyleattr, defstyleres); 
 } 

 @override 
 public void onlayoutchildren(recyclerview.recycler recycler, recyclerview.state state) {
  try { 
   super.onlayoutchildren(recycler, state); 
  } catch (indexoutofboundsexception e) { 
   e.printstacktrace(); 
  } 
 } 
} 

2、设置recyclerview的布局管理为

wrapcontentlinearlayoutmanager对象

mrecyclerview.setlayoutmanager(new wrapcontentlinearlayoutmanager(this, linearlayoutmanager.vertical, false));

其实这也不是什么解决方案,只是把这个异常捕获了,不让他奔溃了,这个问题的终极解决方案还是得让google去修复。

以上就是android 常见bug汇总及解决方案的详细内容,更多关于android 常见bug及解决的资料请关注萬仟网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
Copyright © 2017-2021  萬仟网 保留所有权利. 粤ICP备17035492号-1
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com