我的React Native Android应用程序在关闭或按下“后退”按钮时崩溃。看来,如果应用程序使用“后退”按钮退出了,或者应用程序未报告崩溃。
我搜索了许多类似的问题和解决方案,但没有一个对我有用。
我可以完全禁用“后退”按钮,但这会激怒用户无法关闭该应用程序。
我尝试了“ react-native-exit-app”,它显然应该在不调用崩溃通知的情况下关闭应用程序,但这是行不通的。它仍然报告退出时发生崩溃。
我已经尝试过BackHandler.exitApp(),但也会崩溃退出应用程序。
我正在使用React Navigation,并且可以看到“后退”按钮控制路线。我以为可能是造成此问题的原因,所以我尝试禁用它。因此没有“后退”按钮的控制路线。我设法禁用了它,但是不确定是否正确完成了。即便如此,它仍然无济于事,因为该应用程序仍然在“后退”或退出时崩溃。
我也在使用Redux。我在某处读到它可能导致“后退”按钮出现问题。我不知道如何。我还没有尝试过Redux修复程序,因为我不确定Redux如何导致此问题。
我的应用程序中有一个计时器,每1分钟运行一次事件。我想知道这是否可能引起问题?
当应用崩溃时,日志中没有任何有用的信息。它只有一行,但不具体。
我现在有点卡住了。我在Play商店中看到大量报告的崩溃事件。我知道是有人按下“后退”按钮,然后再次打开该应用程序。我需要找到解决方案,但我已经尝试了一切,但没有运气。
有什么想法吗?
---代码
import { BackHandler, ToastAndroid } from 'react-native';
constructor(properties) {
super(properties);
this.handleBackButton = this.handleBackButton.bind(this);
}
componentWillMount() {
BackHandler.addEventListener('hardwareBackPress', this.handleBackButton);
}
componentWillUnmount() {
BackHandler.removeEventListener('hardwareBackPress', this.handleBackButton);
}
handleBackButton = () => {
console.log('Android hardware back button pressed!');
ToastAndroid.show('Exiting the app...', ToastAndroid.SHORT);
BackHandler.exitApp();
return true;
}
-日志
07-04 12:13:50.893 10849 10904 I ReactNativeJS: Android hardware back button pressed!
07-04 12:13:50.895 10849 10904 I ReactNativeJS: Android hardware back button pressed!
07-04 12:13:50.948 10849 10904 I ReactNativeJS: 'appState', 'background'
07-04 12:13:51.641 10849 10849 D ReactNative: ReactInstanceManager.detachViewFromInstance() <--- this is all I see when it crashes
-更新
我设法使堆栈跟踪像这样工作...
cd android
./gradlew installDebug --stacktrace
cd ..
react-native log-android
Firebase似乎崩溃了……
07-04 13:55:55.362 13517 13574 W ReactNativeJS: Overwriting FirebaseError base field "name" can cause unexpected behavior.
07-04 13:55:55.434 13517 13574 W ReactNativeJS: Overwriting FirebaseError base field "name" can cause unexpected behavior.
07-04 13:55:55.493 13517 13574 E ReactNativeJS: [DEFAULT]: Firebase: Firebase App named '[DEFAULT]' already exists (app/duplicate-app).
07-04 13:55:55.493 13517 13574 E ReactNativeJS:
07-04 13:55:55.493 13517 13574 E ReactNativeJS: This error is located at:
07-04 13:55:55.493 13517 13574 E ReactNativeJS: in Wrapper (at renderApplication.js:35)
07-04 13:55:55.493 13517 13574 E ReactNativeJS: in RCTView (at View.js:45)
07-04 13:55:55.493 13517 13574 E ReactNativeJS: in View (at AppContainer.js:98)
07-04 13:55:55.493 13517 13574 E ReactNativeJS: in RCTView (at View.js:45)
07-04 13:55:55.493 13517 13574 E ReactNativeJS: in View (at AppContainer.js:115)
07-04 13:55:55.493 13517 13574 E ReactNativeJS: in AppContainer (at renderApplication.js:34)
07-04 13:55:55.550 13517 13574 E ReactNativeJS: [DEFAULT]: Firebase: Firebase App named '[DEFAULT]' already exists (app/duplicate-app).
---解决了!
检查堆栈跟踪非常有帮助。一旦完成该工作,我就会发现是Firebase引起了问题。
我解决了这样的问题:
if (!firebase.apps.length) {
firebase.initializeApp({
...
});
}
答案 0 :(得分:0)
在卸载组件时是否要删除事件侦听器。大多数路由库都会重新安装视图,从而导致添加新的侦听器,如果发生这种情况,则应用程序可能会出现故障甚至崩溃。
componentDidMount() {
this.backHandler = BackHandler.addEventListener('hardwareBackPress', () => {
if (!this.shouldBeAppClosed()) {
this.yourBackButtonFunction();
return true;
}
return false;
});
}
componentWillUnmount() {
this.backHandler.remove();
}