Не работает сеть React Native для Android

#android #react-native #fetch

#Android #react-native #выборка

Вопрос:

Я запускаю приложение React Native на эмуляторе Android, но обнаружил, что сеть не работает, я запускаю ее на iOS, она работает нормально. Вот простой код:

 import React from 'react';
import {StyleSheet, View, Text} from 'react-native';

export default () => {
  React.useEffect(() => {
    const useFetch = async () => {
      try {
        console.log('fetch ...');
        let response = await fetch('https://mytestdomain.com');
        console.log(response.status);
        // let json = await response.json();
      } catch (error) {
        console.log(error);
      }
    };
    useFetch();

    const useXMLHttpRequest = async () => {
      try {
        var request = new XMLHttpRequest();
        request.onreadystatechange = (e) => {
          if (request.readyState !== 4) {
            console.log(request.readyState);
            return;
          }

          if (request.status === 200) {
            console.log('success', request.responseText);
          } else {
            console.warn('error');
          }
        };

        request.open('GET', 'https://mytestdomain.com');
        request.send();

      } catch (error) {
        console.log(error);
      }
    };
    useXMLHttpRequest();
  }, []);

  return (
    <View style={styles.layout}>
      <Text>React Native Android networking</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  layout: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});
  

По вызову useFetch() Я просто вижу «выборку …» в консоли, даже не вижу response.status, и ошибки от catch нет.

По вызову useXMLHttpRequest() Я вижу request.readyState равно 1.

Заранее спасибо за любую помощь

Комментарии:

1. Привет, ты смог решить эту проблему?

Ответ №1:

Вероятно, вам следует предоставить этому асинхронному журналу более явное сообщение, чтобы найти это конкретное сообщение среди других журналов, например :

 console.log("RS : "   response.status);
  

Я попытался воспроизвести вашу проблему, и я не могу, она отлично работает на моем симуляторе Android.
Не могли бы вы поделиться своими журналами консоли?

Обходной путь заключается в использовании библиотеки @react-native-community / netinfo, чтобы определить, есть ли у вас доступ в Интернет или нет.

Будьте осторожны, это может быть медленно.

Эта библиотека предоставляет слушателю изменения сведений о соединении. Получение сведений о подключении может быть медленным… вам нужно будет протестировать его на реальных устройствах, чтобы определить, является ли этот обходной путь эффективным или нет.

Быстрая демонстрация на основе вашего исходного кода :

     [...]
    import { StyleSheet, View, Text } from "react-native";
     import NetInfo from "@react-native-community/netinfo";
    
    export default () => {
    -  React.useEffect(() => {
       NetInfo.addEventListener((netInfo) => {
        const useFetch = async () => {
        try {
    -        console.log("fetch ...");
    -        let response = await fetch("https://mytestdomain.com");
    -        console.log(response.status);
    -        // let json = await response.json();
             // Just because there is a connection, it does not mean that internet is accessible, so test both isConnected and isInternetReachable
             if (netInfo.isConnected amp;amp; netInfo.isInternetReachable) {
               console.log("fetch ...");
               let response = await fetch(
                 "https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch"
               );
               console.log("start 1");
               console.log("success 1", response.status);
               console.log("stop 1");
             } else {
               console.log("internet is not ready");
             }
        } catch (error) {
    [...]