Android 常见bug汇总及解决方案

 更新时间:2021年3月24日 15:00  点击:1755

作为开发人员,平时总会遇到各种各样的问题,之前都没有收集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及解决的资料请关注猪先飞其它相关文章!

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • C#中的两种debug方法介绍

    这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹、利用宏定义两种方法,需要的朋友可以参考下...2020-06-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
  • Android 开发之布局细节对比:RTL模式

    下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
  • 解决idea中debug工具栏消失后如何显示的问题

    这篇文章主要介绍了解决idea中debug工具栏消失后如何显示的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-18
  • Android中使用SDcard进行文件的读取方法

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
  • idea 无法debug调试的解决方案

    这篇文章主要介绍了idea 无法debug调试的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-09
  • 用Intel HAXM给Android模拟器Emulator加速

    Android 模拟器 Emulator 速度真心不给力,, 现在我们来介绍使用 Intel HAXM 技术为 Android 模拟器加速,使模拟器运行度与真机比肩。 周末试玩了一下在Eclipse中使...2016-09-20
  • Android判断当前屏幕是全屏还是非全屏

    在安卓开发时我碰到一个问题就是需要实现全屏,但又需要我们来判断出用户是使用了全屏或非全屏了,下面我分别找了两段代码,大家可参考。 先来看一个android屏幕全屏实...2016-09-20