Android 常見(jiàn)bug匯總及解決方案
作為開(kāi)發(fā)人員,平時(shí)總會(huì)遇到各種各樣的問(wèn)題,之前都沒(méi)有收集bug的習(xí)慣,遇到相同的問(wèn)題總會(huì)有種莫名的熟悉感,或許把問(wèn)題都匯總,方便查找,也可以給大家踩踩坑,后面會(huì)陸續(xù)更新補(bǔ)充!
1、關(guān)于使用OkHttp運(yùn)行時(shí)出現(xiàn)的錯(cuò)誤
報(bào)錯(cuò)如下:
Static interface methods are only supported starting with Android N (--min-api 24): okhttp3.Request okhttp3.Authenticator.lambda$static$0(okhttp3.Route, okhttp3.Response)
大概意思就是靜態(tài)接口方法只從Android N開(kāi)始使用。
解決方案:
因?yàn)殪o態(tài)接口需要在Java 8 下才支持使用,所以我們要使用靜態(tài)接口,就需要在app的build.gradle文件中配置聲明,使用Java 8編譯。
所以需要加入以下代碼來(lái)聲明:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
修改如下圖所示:

添加完成以后,同步一下,然后重新運(yùn)行項(xiàng)目就可以啦。
2、圖片輪播控件com.youth.banner使用Glide異步加載圖片時(shí)發(fā)生的崩潰
錯(cuò)誤信息:
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)
根據(jù)錯(cuò)誤信息找到發(fā)生閃退的代碼位置:
//自定義的圖片加載器
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);
//報(bào)錯(cuò)地方
Glide.with(context).load((String) path).apply(options).into(imageView);
}
}
跟蹤日志進(jìn)入Glide調(diào)用的地方發(fā)現(xiàn),出現(xiàn)在
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");
}
}
這個(gè)錯(cuò)誤是使用Glide異步加載圖片的時(shí)候,Activity已經(jīng)Destroyed
解決方案:
1、在使用Glide加載圖片前,先進(jìn)行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、在錯(cuò)誤的位置進(jìn)行替換:
//自定義的圖片加載器
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、接入容聯(lián)七陌客服系統(tǒng),進(jìn)入客服界面時(shí)閃退問(wèn)題
錯(cuò)誤信息:

圖片看起來(lái)不清晰,看報(bào)錯(cuò)代碼:
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)
我們可以根據(jù)報(bào)錯(cuò),跳到報(bào)錯(cuò)的地方:

該報(bào)錯(cuò)的意思就是:沒(méi)有
into(Landroid/widget/ImageView)
的方法,代碼能編譯通過(guò),說(shuō)明項(xiàng)目中肯定是添加依賴(lài)了,那怎么還會(huì)報(bào)這個(gè)錯(cuò)誤呢?還沒(méi)添加依賴(lài)之前,項(xiàng)目中也是使用的Glide進(jìn)行圖片的加載,會(huì)不會(huì)是項(xiàng)目中的Glide與容聯(lián)Demo中的Glide有沖突呢。
我們可以根據(jù)報(bào)錯(cuò)的地方into方法,點(diǎn)進(jìn)入看源碼:

可以看到容聯(lián)Demo使用的Glide版本是3.7.0。
再來(lái)看看項(xiàng)目中Glide使用的版本:

可以看到項(xiàng)目中使用的Glide版本是4.5.0。
這時(shí)就想到真的很大概率是兩者的Glide版本有沖突了。
果然將容聯(lián)Demo中的Glide版本改成4.5.0之后,編譯運(yùn)行進(jìn)入客服界面后,沒(méi)有報(bào)錯(cuò)了,完美解決。
4、android 7.0系統(tǒng)解決拍照的問(wèn)題
報(bào)錯(cuò)信息:
# 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.在相對(duì)應(yīng)的頁(yè)面中,寫(xiě)如下的方法:
private void initPhotoError(){
// android 7.0系統(tǒng)解決拍照的問(wèn)題
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
}
2.在onCreate中調(diào)用上述的方法。
5、使用RecyclerView滑動(dòng)閃退問(wèn)題
錯(cuò)誤信息:

圖片看起來(lái)不清晰,看報(bào)錯(cuò)代碼:
IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter
看這個(gè)代碼,只是并沒(méi)有報(bào)到我們自己的代碼里面來(lái),在底層就崩潰了,在app層面并沒(méi)有,彈出一個(gè)框,說(shuō)應(yīng)用程序已奔潰,而是直接就沒(méi)了,用戶(hù)感覺(jué)很奇怪。這種異常并不是很容易出現(xiàn),而是偶爾出現(xiàn),我的也是在后臺(tái)奔潰日志中,發(fā)現(xiàn)了這種異常,我們自己都不知道什么地方報(bào)錯(cuò)的。
解決方案如下:
1、創(chuàng)建一個(gè)類(lèi)LinearLayoutManagerWrapper
繼承LinearLayoutManager,重寫(xiě)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、設(shè)置RecyclerView的布局管理為
WrapContentLinearLayoutManager對(duì)象
mRecyclerView.setLayoutManager(new WrapContentLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
其實(shí)這也不是什么解決方案,只是把這個(gè)異常捕獲了,不讓他奔潰了,這個(gè)問(wèn)題的終極解決方案還是得讓google去修復(fù)。
以上就是Android 常見(jiàn)bug匯總及解決方案的詳細(xì)內(nèi)容,更多關(guān)于Android 常見(jiàn)BUG及解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android編程判斷SD卡是否存在及使用容量查詢(xún)實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程判斷SD卡是否存在及使用容量查詢(xún)實(shí)現(xiàn)方法,實(shí)例分析了Android針對(duì)SD卡是否存在及使用容量、全部容量等的判斷技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-10-10
Android Rreact Native 常見(jiàn)錯(cuò)誤總結(jié)
這篇文章主要介紹了Android Rreact Native 常見(jiàn)錯(cuò)誤總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android 消息機(jī)制以及handler的內(nèi)存泄露
這篇文章主要介紹了Android 消息機(jī)制以及handler的內(nèi)存泄露的相關(guān)資料,需要的朋友可以參考下2016-09-09
Android開(kāi)啟ADB網(wǎng)絡(luò)調(diào)試方法
今天小編就為大家分享一篇Android開(kāi)啟ADB網(wǎng)絡(luò)調(diào)試方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Android實(shí)現(xiàn)雅虎新聞?wù)虞d視差動(dòng)畫(huà)效果
這篇文章主要介紹了Android實(shí)現(xiàn)雅虎新聞?wù)虞d視差動(dòng)畫(huà)效果,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Anroid四大組件service之本地服務(wù)的示例代碼
本篇文章主要介紹了Anroid四大組件service之本地服務(wù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Android仿今日頭條多個(gè)fragment懶加載的實(shí)現(xiàn)
我們?cè)谧鰬?yīng)用開(kāi)發(fā)的時(shí)候,一個(gè)Activity里面可能會(huì)以viewpager(或其他容器)與多個(gè)Fragment來(lái)組合使用,下面這篇文章主要給大家介紹了關(guān)于利用Android仿今日頭條多個(gè)fragment懶加載的相關(guān)資料,需要的朋友可以參考下。2017-12-12
Android編程實(shí)現(xiàn)支持拖動(dòng)改變位置的圖片中疊加文字功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)支持拖動(dòng)改變位置的圖片中疊加文字功能,可實(shí)現(xiàn)Android圖片與文字動(dòng)態(tài)操作功能,涉及視圖及圖片動(dòng)態(tài)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
Android實(shí)現(xiàn)關(guān)機(jī)后數(shù)據(jù)不會(huì)丟失問(wèn)題
這篇文章主要介紹了Android實(shí)現(xiàn)關(guān)機(jī)后數(shù)據(jù)不會(huì)丟失問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10

