app閃退問題原因:
安卓7以上版本(7和7以下版本不會出現閃退):在螢屏不可視區域加載webView或者webView不在可視區域內切換頁面時app崩潰閃退(在螢屏可視區域加載webView或者webView在可視區域內切換頁面不會閃退)
解決辦法
- 進入頁面時
給wevView設定狀態為false并且延時加載,設定lodding,等其他視圖渲染完畢后wevView狀態設定為true,然后加載webView,
import {useNavigation} from '@react-navigation/native';
const navigation = useNavigation();
const [showChart, setShowChart] = useState(false)
useEffect(() => {
dispatch(changeLoading({isShow: true, message: "加載中"}))
setTimeout(() => {
setShowChart(true);
dispatch(changeLoading({isShow:false,message:"加載中"}));
}, 1000);
},[])
<View>
{showChart?<wevView
h5height={scale(150)}
h5width={scale(300)}
cannotTouch={true}
/>:null}
</View>
- 切換頁面時
設定自定義回傳事件,同樣延時切換頁面,在切換時先銷毀webView然后在進行頁面切換(這里舉例回傳上一頁)
// BackHandler API 用于監聽設備上的后退按鈕事件,可以呼叫你自己的函式來處理后退行為,此 API 僅能在 Android 上使用,
// 官網地址:https://reactnative.cn/docs/backhandler
import { TouchableOpacity,BackHandler } from 'react-native'
import {useNavigation} from '@react-navigation/native';
const navigation = useNavigation();
// 自定義回傳按鈕
navigation.setOptions({
headerBackImage: () => (
<TouchableOpacity
// pop回傳時執行操作
onPress={pop}
style={{
height: scale(34),
width: scale(80),
paddingLeft: scale(12),
justifyContent: 'center',
// backgroundColor:'red',
}}>
<Image
// 可點擊區域設定大一點
style={{width: scale(12), height: scale(20)}}
source={require('../image/back.png')}
/>
</TouchableOpacity>
),
});
const pop = () => {
// 設定webView狀態為false,延時退出
setShowChart(false);
setTimeout(() => {
navigation.pop();
}, 200);
return true;
}
useEffect(() => {
if (Platform.OS == 'android') {
//添加回傳監聽事件
BackHandler.addEventListener('hardwareBackPress', pop);
}
return () => {
if (Platform.OS == 'android') {
// 洗掉監聽事件
BackHandler.removeEventListener('hardwareBackPress', pop);
}
};
},[])
分割線————————————————————————————
定位問題與解決問題的程序
定位問題的程序比較痛苦
開發使用安卓版本:android10
因為專案中已經有很多功能使用webView并沒有什么問題,所以當出現閃退的時候并沒有第一時間考慮到時webView的問題(踩坑無數)
解決問題的程序更加痛苦
第一次懷疑是webView的問題的時候是測驗在使用android7的模擬器并不會出現閃退現象(初步懷疑可能與安卓10的垃圾回收有關,并沒有仔細排查)
后來發現其他功能用到的webView都是在頁面可視區域加載且頁面不可滑動,后來把閃退頁面的webView放到螢屏可視區域并延時渲染在進入頁面時不會出現閃退問題(以為解決了)
再后來發現在頁面滑動后,webView不在可視區域內進行回傳上一頁操作時,又出現閃退,然后添加回傳監聽,延時退出(此時徹底解決問題)(踩坑無數)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/300508.html
標籤:其他
