Иногда мое приложение вылетает с UnknownHostException
В моем приложении у меня есть доступ к веб-серверу. В некоторых телефонах он работает нормально, но при тестировании в Samsung Galaxy Model No - GT-S5830i Android Version - 2.3.6 продолжает показывать исключение Unknown host. Я проверил URL из браузера, он работает нормально.
private void submitUploadData(String url ,Map<String, String> param) throws IOException
{
URL siteUrl;
try {
siteUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) siteUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
Set getkey = param.keySet();
Iterator keyIter = getkey.iterator();
String content = "";
for(int i=0; keyIter.hasNext(); i++) {
Object key = keyIter.next();
if(i!=0) {
content += "&";
}
content += key + "=" + param.get(key);
}
out.writeBytes(content.trim());
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
while((line=in.readLine())!=null) {
System.out.println(line);
}
in.close();
//Intent home = new Intent(SyncHttp.this,TimeAndExpensesSKActivity.class);
//startActivity(home);
db.updateTimeExported(1);
db.updateExpensesExported(1);
db.close();
db.close();
if(db.getLogCount()==0){
db.insertSyncDateDetails(getDateandTime());}
else{
db.updateSyncDateDetails(1, getDateandTime());}
} catch (MalformedURLException e) {
e.printStackTrace();
}
this.setResult(FINISH_RESULT);
db.close();
}
Я уже добавил разрешения
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Я действительно смущен, почему происходит это исключение.
Спасибо за помощь ребята.
4 ответа
Мое приложение сделало это тоже. Обычно это вызвано нестабильным сетевым подключением. Что я сделал, так это поймал UnknownHostException
и изменить код таким образом, чтобы, если UnknownHostException
случилось, я пытаюсь повторно получить URL снова, после нескольких миллисекунд сна.
Основной алгоритм выглядит примерно так:
private void submitUploadData(String url ,Map<String, String> param) throws IOException
{
URL siteUrl;
boolean isDataSubmitted = false;
while(!isDataSubmitted){
try {
//do your complicated http process
isDataSubmitted = true;
} catch(UnknownHostException uhe){
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
У меня также возникали некоторые проблемы с использованием URLConnections, особенно HTTPS на Samsung Galaxy TAB, но я мог бы предположить, что это, вероятно, происходит и на других моделях, поскольку существует множество устройств с одинаковыми именами, но предназначенных для разных рынков и операторов мобильной связи.
Пока что я не нашел пути извинения, так как стараюсь избегать класса URLConnection из-за множества других проблем.
Я предлагаю использовать HTTP-клиент Apache для связи с вашими API. Вы можете погуглить тонну примеров его использования.
Также, глядя на ваш код, я бы посоветовал прочитать немного больше о выражениях блока try-catch-finally в java. очень важно правильно закрыть соединения в конце или в случае ошибок.
Другие возможности:
Нет активного подключения (мобильный или Wi-Fi)
Вам не хватает "http://www." в вашем URL.
Я думаю, что вызов close() для DataOutputStream до того, как вы получите свой ввод, может закрыть все соединение - попробуйте закомментировать эту строку.
Вы проверили URL из браузера телефона? Пожалуйста, зарегистрируйте URL-адрес, который вы передаете функции, и попробуйте в браузере вашего телефона. Я бы подумал об отсутствующем / неправильном спецификаторе протокола и / или проблемах формирования строки URL, о которых этот конкретный телефон не прощает