Intereting Posts
Проект Eclipse в меркурийный Является ли wpa_supplicant специфичным для Android-устройства или для версии для Android? Android: значение привязки в индексе 1 равно null OpenCV: оптимизация вычисления оптического потока В чем разница .string () и .toString () для OkHttp? Android. Включить импорт импортных контактов Односторонние и многотактные жесты Android в одной и той же библиотеке смущают GesturesOverlayView? Экран камеры / предварительный просмотр в полноэкранном режиме не поддерживает соотношение сторон – изображение искажено, растягивается, чтобы поместиться на экране В чем разница между задним стеком и стеком истории? Андроидный фрагмент onRestoreInstanceState Событие PhoneGap deviceready не срабатывает Будет ли Android поддерживать WebSockets в предстоящей версии? Содержимое приложения выходит за панель навигации в android L SQLite Исключение: нет такой таблицы Ошибка Android и Admob неожиданно хранят данные и значения кеша

Android НеизвестныйHostException Facebook SDK

Вот ситуация. Мое приложение работает нормально и может устанавливать соединения с URL-адресами. НО через несколько часов после запуска приложения, внезапно запросы Facebook дают мне следующую ошибку.

09-26 10:01:25.175: W/System.err(252): java.net.UnknownHostException: Host is unresolved: xyz.com:80 09-26 10:01:25.175: W/System.err(252): at java.net.Socket.connect(Socket.java:1037) 09-26 10:01:25.175: W/System.err(252): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62) 09-26 10:01:25.175: W/System.err(252): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager$ConnectionPool.getHttpConnection(HttpConnectionManager.java:145) 09-26 10:01:25.175: W/System.err(252): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager.getConnection(HttpConnectionManager.java:67) 09-26 10:01:25.175: W/System.err(252): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getHTTPConnection(HttpURLConnection.java:821) 09-26 10:01:25.175: W/System.err(252): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:807) 09-26 10:01:25.175: W/System.err(252): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1051) 09-26 10:01:25.175: W/System.err(252): at java.net.URL.openStream(URL.java:653) 

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

Я должен отметить: Когда я устанавливаю соединения с моим собственным сервером, никаких проблем не возникает.

Эта ошибка вызвана следующими строками:

 mAsyncFacebookRunner.request("fql", paramaters, new FQLRequestListener()); 

java.net.UnknownHostException обычно означает, что IP-адрес хоста не может быть разрешен, хотя фактическая причина может варьироваться в зависимости от конкретного случая. Если код реализован правильно (независимо от того, какой API вы используете, HttpUrlConnection или DefaultHttpClient), и это все еще случается с перерывами, это, скорее всего, ошибка в старой системе Android, связанной с кэшированием DNS и управлением TTL:

Проблема 7904: Android не поддерживает TTL и кэширует результат DNS в течение 10 минут

Это исправлено с Android 4.1, см. Дополнительные примечания в InetAddress API Doc :

Кэширование DNS

В Android 4.0 (Ice Cream Sandwich) и ранее кэширование DNS выполнялось как с помощью InetAddress, так и с помощью библиотеки C, что означало, что DNS TTL не могут быть выполнены правильно. В более поздних версиях кеширование выполняется исключительно библиотекой C, а для них выполняются ТТЛ DNS.

Для старой версии Android Android предлагает настроить параметры DNS уровня Java networkaddress.cache.ttl и networkaddress.cache.negative.ttl , см. JavaDoc в старом исходном коде :

 /** * ... ... * * <h4>DNS caching</h4> * <p>On Android, addresses are cached for 600 seconds (10 minutes) by default. Failed lookups are * cached for 10 seconds. The underlying C library or OS may cache for longer, but you can control * the Java-level caching with the usual {@code "networkaddress.cache.ttl"} and * {@code "networkaddress.cache.negative.ttl"} system properties. These are parsed as integer * numbers of seconds, where the special value 0 means "don't cache" and -1 means "cache forever". * * ... ... */ 

Связанная дискуссия:

  • UnknownHostException в java (это тоже только иногда)
  • Какова цель кэширования DNS уровня Java?

Попробуйте настроить эти два свойства и посмотреть, не имеет значения, если вы настроите таргетинг на старую версию Android.

У меня нет никаких основных концептуальных знаний о сетевом подключении и кешировании DNS и управлении TTL.

Но та же проблема возникла и для меня, и в то время как раз в качестве обходного пути я внес несколько изменений в проект Util.java проекта Facebook (исходный проект SDK для Facebook), а затем использовал его для моего проекта. Эти два изменения используются только из разных ответов stackoverflow.

В функции openUrl (String url, String method, Bundle params)

Замените эту строку,

  HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); 

С этими линиями,

  try { InetAddress i = InetAddress.getByName(url); } catch (UnknownHostException e1) { e1.printStackTrace(); } HttpURLConnection conn = (HttpURLConnection) new URL(url) .openConnection(); conn.setConnectTimeout(50000); 

И моя проблема была уменьшена.

Это поможет, если вы сможете опубликовать код ….. но, по моему опыту, вызывается httpClient.getConnectionManager (). Shutdown (); Разрешили эту проблему.