Android|Android 常见bug汇总及解决方案
目录
- 1、关于使用OkHttp运行时出现的错误
- 2、图片轮播控件com.youth.banner使用Glide异步加载图片时发生的崩溃
- 3、接入容联七陌客服系统,进入客服界面时闪退问题
- 4、android 7.0系统解决拍照的问题
- 5、使用RecyclerView滑动闪退问题
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_8targetCompatibility 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 {@Overridepublic 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 {@Overridepublic 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.FileUriExposedExceptionfile:///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|Android 常见bug汇总及解决方案】以上就是Android 常见bug汇总及解决方案的详细内容,更多关于Android 常见BUG及解决的资料请关注脚本之家其它相关文章!
推荐阅读
- 15款可加速和提升性能的最佳免费Android清理应用
- Android前10个最佳免费文件管理器应用合集
- 10多个带音频的Android最佳屏幕录像机应用合集
- iPhone和Android跟踪和限制社交媒体使用的最佳应用
- Could not find com.android.tools.build:gradle:3.0.0-alpha3
- Android实现浮层的上下滑动(支持内部加入View)
- Pretty UI Design For Android -- 滑动背景透明列表
- Android推送技术研究
- Android 开发笔记___Intent的使用
- Android性能优化篇 [ 谷歌官方 ]