關于作者:CSDN內容合伙人、技術專家, 從零開始做日活千萬級APP。
專注于分享各領域原創系列文章 ,擅長java后端、移動開發、商業變現、人工智能等,希望大家多多支持。
未經允許不得轉載
目錄
- 一、導讀
- 二、概覽
- 三、問題記錄
- 四、 推薦閱讀
一、導讀
我們繼續總結學習遇到的問題,溫故知新。
今天遇到一個線上問題,啟動就閃退,比較坑,在此做一個記錄,防止掉坑。
二、概覽
我們在啟動時做了一個啟動圖的優化,啟動時讓用戶看到公司的logo,同時解決黑屏、白屏問題,這時也給用戶一個假象,感覺啟動起來很快一樣。
但是上線后包了一些錯誤, 如下:
java.lang.RuntimeException:Unable to start activity ComponentInfo{com.qxx/com.qxx.Activity}: android.view.InflateException: Binary XML file line #9: Error inflating class <unknown>
2
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:26913)Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #51: <bitmap> requires a valid src attribute
java.lang.RuntimeException:Unable to start activity ComponentInfo{com.xx/com.xx.Activity}: android.content.res.Resources$NotFoundException: File res/xyadx.xml from drawable resource ID #xxxx
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:25211)
......
Caused by:
org.xmlpull.v1.XmlPullParserException:Binary XML file line #91: <bitmap> requires a valid src attribute
# main(1)org.xmlpull.v1.XmlPullParserExceptionBinary XML file line #9: <bitmap> requires a valid 'src' attributejava.lang.RuntimeException:Unable to start activity ComponentInfo{com.xxx/com.xxxActivity}: android.content.res.Resources$NotFoundException: Drawable com.xxx:drawable/loading_bg with resource ID #0x7xxf2
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:27681)
......
Caused by:
org.xmlpull.v1.XmlPullParserException:Binary XML file line #19: <bitmap> requires a valid 'src' attribute
三、問題記錄
配置上中下三個image,再配個背景,更顯高大上,
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">全局背景<item><color android:color="#FFFFFF" /></item>配置上中下三個image<item><bitmapandroid:gravity="top"android:src="@drawable/loading_bg" /></item><itemandroid:bottom="@dimen/dp_10"><bitmapandroid:gravity="center"android:src="@drawable/loading_slogan" /></item><item><bitmapandroid:gravity="bottom"android:src="@drawable/loading_buttom_logo" /></item>
</layer-list>
我們一起看看源碼報錯的地方 BitmapDrawable.java
/*** Updates the constant state from the values in the typed array.*/private void updateStateFromTypedArray(TypedArray a, int srcDensityOverride)throws XmlPullParserException {final Resources r = a.getResources();final BitmapState state = mBitmapState;final int srcResId = a.getResourceId(R.styleable.BitmapDrawable_src, 0);if (srcResId != 0) {...一系列的操作后,根據resid去獲取bitmap,如果bitmap為空,則會拋出異常Bitmap bitmap = null;try (InputStream is = r.openRawResource(srcResId, value)) {ImageDecoder.Source source = ImageDecoder.createSource(r, is, density);bitmap = ImageDecoder.decodeBitmap(source, (decoder, info, src) -> {decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE);});} catch (Exception e) {}if (bitmap == null) {throw new XmlPullParserException(a.getPositionDescription() +": <bitmap> requires a valid 'src' attribute");}}...}
一系列的操作后,根據resid去獲取bitmap,如果bitmap為空,則會拋出異常,
分析原因后,我們得出結論
- bitmap 使用 src來引用, android:src
- 的src不允許為xml drawables
- src引用的圖片資源在多分辨率下都要有,不讓容易出問題
四、 推薦閱讀
Java 專欄
SQL 專欄
數據結構與算法
Android學習專欄
未經允許不得轉載