Иногда мое приложение вылетает с 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. очень важно правильно закрыть соединения в конце или в случае ошибок.

Другие возможности:

  1. Нет активного подключения (мобильный или Wi-Fi)

  2. Вам не хватает "http://www." в вашем URL.

Я думаю, что вызов close() для DataOutputStream до того, как вы получите свой ввод, может закрыть все соединение - попробуйте закомментировать эту строку.

Вы проверили URL из браузера телефона? Пожалуйста, зарегистрируйте URL-адрес, который вы передаете функции, и попробуйте в браузере вашего телефона. Я бы подумал об отсутствующем / неправильном спецификаторе протокола и / или проблемах формирования строки URL, о которых этот конкретный телефон не прощает

Другие вопросы по тегам