使用AppState解决App从后台唤醒后数据刷新的问题

330 阅读1分钟

问题

App长时间在后台停留的情况下,当用户从后台再次唤醒时,页面会出现空白。此时,需要把应用从后台退出,再打开一次才能显示数据。

分析原因

这可能是由于React Native应用在后台停留过长时间导致的内存不足而导致的问题。

解决方案:

借助AppState API来检测应用程序是否在前台运行。当检测到应用程序从后台返回到前台时,我们来做一些操作。
1,在App.js文件中创建一个AppState组件,也可以在任何单一组件中使用。
2,添加一个事件侦听器,用来检测应用程序是否在前台运行。当应用程序从后台返回前台时,事件侦听器将被触发。
3,使用路由信息来判断应用程序在哪个页面,添加相应的需要重新加载数据的逻辑。

import React, {useEffect, useRef} from 'react';
import {AppState, View, Text, Button} from 'react-native';
import {useNavigation} from '@react-navigation/native';

const App = () => {
  const appState = useRef(AppState.currentState);
  const navigation = useNavigation();

  useEffect(() => {
    //在组件加载时添加AppState事件侦听器,以便在应用程序从后台返回前台时触发
    AppState.addEventListener('change', _handleAppStateChange);

    //在卸载组件时,删除事件侦听器,以避免内存泄漏。
    return () => {
      AppState.removeEventListener('change', _handleAppStateChange);
    };
  }, []);

  const _handleAppStateChange = nextAppState => {
    if (
      appState.current.match(/inactive|background/) &&
      nextAppState === 'active'
    ) {
      console.log(
        '应用程序已进入' + navigation.getCurrentRoute().name + ' 页面!',
      );
      // 根据当前页面的名称来判断应该刷新哪个页面的数据
      if (navigation.getCurrentRoute().name === 'Home') {
        // 在这里添加你需要重新加载Home页面数据的逻辑
      } else if (navigation.getCurrentRoute().name === 'My') {
        // 在这里添加你需要重新加载My页面数据的逻辑
      }
    }
    appState.current = nextAppState;
  };

  return (
    <View>
      <Text>App</Text>
      <Button title="点击" onPress={() => alert('Hello world!')} />
    </View>
  );
};

export default App;