React 本机图像选择器导致应用程序无错误地重新启动
React native image picker causes application to restart without error
我正在使用 react-native-image-picker 2.3.1、react-native 0.63.3 和 react 16.3.1。当使用图像选择器启动相机时,在某些设备上(三星设备,Android 10,平板电脑和手机),用户拍照后,本机反应应用程序将重新初始化自身而不会出现任何错误或正确警告。行为不一致:有时,用户只能拍摄 1 张照片,然后应用程序重新启动,其他时候发生在拍摄第 33 张照片时。该行为无法在模拟器中重现,也无法在 One plus 或摩托罗拉等不同设备中重现。
系统 logcat 日志只显示了很少的相关细节,我可以缩小范围的是:
15533-15533/? E/com.sfsdriver:runtime_flags 中设置的未知位:0x8000
E/InputDispatcher: channel 'd0f2b6f com.sfsdriver/com.sfsdriver.MainActivity (server)' ~ 频道不可恢复地损坏,将被处理掉! (可能在应用程序不再处于活动状态后发生)
E/memtrack: 无法加载 memtrack 模块
还有这样的行:7165-13038/com.sfsdriver I/ReactNativeJNI: JS VM received Memory warning (pressure level: TRIM_MEMORY_COMPLETE), 运行 a GC
当应用程序在拍照后成功返回应用程序 activity 和应用程序重新启动时都会发生。
我还尝试了以下 react-native 库:expo-image-picker、react-native-image-picker:v3.0.0-vnext.3
正在还原有关此问题的信息。完整的讨论历史可以在这里查看:https://github.com/react-native-image-picker/react-native-image-picker/issues/1502。
总结如下:问题发生在已用内存接近最大可用内存的设备上,并且几乎所有为相机启动新 Activity 的 react-native 库都会发生此问题(expo-image-picker,react -native-crop-image-picker 等)。当这种情况发生时,Android OS 有能力终止后台任务以回收内存(某些专有版本的 Android 可以比其他版本更积极地终止后台任务)。当用户启动一个新的意图打开相机时,主要的 React 本机应用程序进入后台并可以被 Android OS 杀死(并由 Android [=30= 重新创建) ] 当用户 returns 到初始应用程序时)。当应用程序被终止时,所有信息都会丢失,除非您有一种机制在进入后台时保持状态。通常,Android OS 将向调用应用程序提供最后的 Activity 结果(在本例中是用相机应用程序拍摄的图像),在本例中是 React Activity.不幸的是,当 React Context 被销毁并稍后重新创建时,React native 如何处理这个 onActivity 结果存在问题,可以在此处关注该问题:https://github.com/facebook/react-native/issues/30277.
在解决该问题之前,此问题将持续存在,主要是在低内存设备的情况下。对于那些不想要花哨的相机选项,只想拍照或开始录像的人,您可以使用 React Native Camera 库 (https://github.com/react-native-camera/react-native-camera) 来解决这个问题 activity 由Android 系统。不同之处在于 RNCamera 库不会启动新的 Android activity(只是将相机嵌入到您指定的任何位置)这意味着您当前的 React 应用程序将保持活动状态,即使在使用 picture/recording视频。
我正在使用 react-native-image-picker 2.3.1、react-native 0.63.3 和 react 16.3.1。当使用图像选择器启动相机时,在某些设备上(三星设备,Android 10,平板电脑和手机),用户拍照后,本机反应应用程序将重新初始化自身而不会出现任何错误或正确警告。行为不一致:有时,用户只能拍摄 1 张照片,然后应用程序重新启动,其他时候发生在拍摄第 33 张照片时。该行为无法在模拟器中重现,也无法在 One plus 或摩托罗拉等不同设备中重现。 系统 logcat 日志只显示了很少的相关细节,我可以缩小范围的是:
15533-15533/? E/com.sfsdriver:runtime_flags 中设置的未知位:0x8000
E/InputDispatcher: channel 'd0f2b6f com.sfsdriver/com.sfsdriver.MainActivity (server)' ~ 频道不可恢复地损坏,将被处理掉! (可能在应用程序不再处于活动状态后发生)
E/memtrack: 无法加载 memtrack 模块
还有这样的行:7165-13038/com.sfsdriver I/ReactNativeJNI: JS VM received Memory warning (pressure level: TRIM_MEMORY_COMPLETE), 运行 a GC 当应用程序在拍照后成功返回应用程序 activity 和应用程序重新启动时都会发生。
我还尝试了以下 react-native 库:expo-image-picker、react-native-image-picker:v3.0.0-vnext.3
正在还原有关此问题的信息。完整的讨论历史可以在这里查看:https://github.com/react-native-image-picker/react-native-image-picker/issues/1502。 总结如下:问题发生在已用内存接近最大可用内存的设备上,并且几乎所有为相机启动新 Activity 的 react-native 库都会发生此问题(expo-image-picker,react -native-crop-image-picker 等)。当这种情况发生时,Android OS 有能力终止后台任务以回收内存(某些专有版本的 Android 可以比其他版本更积极地终止后台任务)。当用户启动一个新的意图打开相机时,主要的 React 本机应用程序进入后台并可以被 Android OS 杀死(并由 Android [=30= 重新创建) ] 当用户 returns 到初始应用程序时)。当应用程序被终止时,所有信息都会丢失,除非您有一种机制在进入后台时保持状态。通常,Android OS 将向调用应用程序提供最后的 Activity 结果(在本例中是用相机应用程序拍摄的图像),在本例中是 React Activity.不幸的是,当 React Context 被销毁并稍后重新创建时,React native 如何处理这个 onActivity 结果存在问题,可以在此处关注该问题:https://github.com/facebook/react-native/issues/30277.
在解决该问题之前,此问题将持续存在,主要是在低内存设备的情况下。对于那些不想要花哨的相机选项,只想拍照或开始录像的人,您可以使用 React Native Camera 库 (https://github.com/react-native-camera/react-native-camera) 来解决这个问题 activity 由Android 系统。不同之处在于 RNCamera 库不会启动新的 Android activity(只是将相机嵌入到您指定的任何位置)这意味着您当前的 React 应用程序将保持活动状态,即使在使用 picture/recording视频。