Очистить данные приложения, если они отключены от inte rnet в течение более 5 минут в реагировать родной - PullRequest
0 голосов
/ 05 марта 2020

Я хочу очистить данные реагирующего собственного приложения, если мое приложение отключено от inte rnet более чем на 5 минут.

Я использую реагирующее собственное NetInfo для проверки сетевого подключения положение дел. Экономия времени, когда приложение отключено, и проверка, когда оно снова подключится к inte rnet. Если интервал больше 5 минут, я хочу очистить данные приложения.

Мой код:

class OfflineMessage extends PureComponent {
  constructor(props) {
    super(props);
    this.state = {
      isConnected: true
    };
  }

  componentDidMount() {
    NetInfo.addEventListener((state) => {
      this.handleConnection(state.isConnected);
    });
  }

  componentWillUnmount() {
    NetInfo.removeEventListener((state) => {
      this.handleConnection(state.isConnected);
    });
  }

handleConnection = (isConnected) => {
  this.setState({ isConnected });

  if(!isConnected){
    this.startTimer();
  } else {
    this.checkElapsed();
  }
};

startTimer = async () => {
  try {
    console.log('Internet disconnected at: ');
    await AsyncStorage.setItem('time', JSON.stringify(Date.now()));

  } catch (error) {
    // console.log('Something went wrong', error);
  }
}

checkElapsed = async () => {
    try {
      let startTime =  await AsyncStorage.getItem('time');

      if(startTime){
        let endTime = Date.now();
        const elapsedTime = Math.floor((endTime -JSON.parse(startTime))/1000);
        if(elapsedTime > 5){
           alert("5 min is completed.");
           // Clear app data
         }
        console.log('Time elapsed'+ elapsedTime);
      }

  } catch (error) {
    // console.log('Something went wrong', error);
  }
}

Проблема : оба метода startTimer и checkElapsed вызвали всякий раз, когда состояние подключения меняется. Что не так с этим кодом.

, если я изменяю данный код следующим образом:

    state = {
      isConnected: true
    };

  componentDidMount() {
    this.unsubscribeFromNetInfo = NetInfo.addEventListener((state) => {
          this.handleConnection(state.isConnected);
      });
  }

  componentWillUnmount() {
     this.unsubscribeFromNetInfo();
  }

  handleConnection = (isConnected) => {
    console.log(isConnected);
    this.setState({ isConnected });
};

EventListener вызывается несколько раз, и статус часто меняется на true false, true, false.

1 Ответ

1 голос
/ 05 марта 2020

Теперь вы неправильно обрабатываете подписку NetInfo, в соответствии с https://github.com/react-native-community/react-native-netinfo#usage

Вы должны сделать:

componentDidMount() {
    this.unsubscribeFromNetInfo = NetInfo.addEventListener(state => {
        this.handleConnection(state.isConnected);
    });
}

componentWillUnmount() {
    this.unsubscribeFromNetInfo();
}

Кроме того, если вы хотите для проверки в течение 5 минут используйте:

if (elapsedTime > 5 * 60)

в качестве преобразования

Math.floor((endTime - JSON.parse(startTime)) / 1000)

преобразует его в секунды, а не минуты.

В текущем заявите, ваше приложение будет запускать почти все, так как код проверяет только 5 секунд.

В противном случае реализованная вами логика c должна работать :)

...