Android отображает сообщение о тайм-ауте в веб-службе при подключении или тайм-аут чтения при подключении к Интернету

Привет, мне нужно отобразить сообщение «Данные не получены» при подключении или прочитать тайм-аут.

Я реализую это с помощью java.net.SocketTimeoutException, но не могу получить сообщение, если нет данных, полученных при подключении к Интернету.

Я получаю помощь только через интернет, подключенный или нет.

Но на самом деле я хочу получить его, когда интернет подключен.

Код проверки подключения к Интернету

public static boolean isNetworkConnected(Activity activity) {
    ConnectivityManager connectivity = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null) {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null)
            for (int i = 0; i < info.length; i++)
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }

    }
    return false;
}

Код

@Override
protected String doInBackground(String... params) {
    // TODO Auto-generated method stub
    String result = "";
    try {
        URL url = new URL(params[0]);
        httpConnection = (HttpURLConnection) url.openConnection();
        httpConnection.setRequestProperty("Accept", "application/json");
        httpConnection.setReadTimeout(10000);
        httpConnection.setConnectTimeout(15000);
        httpConnection.setRequestMethod("POST");
        httpConnection.setDoInput(true);
        httpConnection.setDoOutput(true);

        OutputStream os = httpConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
        writer.write(String.valueOf(values));
        writer.flush();
        writer.close();
        os.close();

        int responseCode = httpConnection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            InputStream iStream = httpConnection.getInputStream();
            InputStreamReader isReader = new InputStreamReader(iStream);
            BufferedReader br = new BufferedReader(isReader);
            String line;
            while ((line = br.readLine()) != null) {
                result += line;
            }
        }
    } catch (java.net.SocketTimeoutException e) {
        Toast.makeText(context, "Network Error : No Data Received.", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
        Log.e("Error : ", e.toString());
    }
    return result;
}

person Rushvi    schedule 19.04.2016    source источник
comment
удалите эти строки и повторите попытку. httpConnection.setReadTimeout(10000); httpConnection.setConnectTimeout(15000);   -  person Darshak    schedule 19.04.2016
comment
Вы можете использовать Волейбол. Volley может легко справиться с такой проблемой.   -  person Zahidul Islam    schedule 19.04.2016
comment
@ZahidulIslam да, лучше использовать Volley   -  person Darshak    schedule 19.04.2016
comment
Тогда как это определить, когда истечет время ожидания и перехватит исключение???   -  person Rushvi    schedule 19.04.2016
comment
Исключение не поймано нормально. Но что вы получаете, когда истекает время чтения или соединения?? Приложение вылетает?? Если да, пожалуйста, вставьте logcat.   -  person Janki Gadhiya    schedule 19.04.2016
comment
Он перехватывается Exception, но не в SocketTimeoutException и возвращает E/Error :: java.net.UnknownHostException   -  person Rushvi    schedule 19.04.2016
comment
UnknownHostException означает, что URL-адрес, который вы передаете, неверен. Попробуйте загрузить этот URL в свой браузер. @Рушви   -  person Janki Gadhiya    schedule 19.04.2016
comment
Это работает хорошо, но с использованием этого кода. Но мне нужно показать исключение тайм-аута, если тайм-аут соединения или тайм-аут чтения.   -  person Rushvi    schedule 20.04.2016


Ответы (1)


Для отображения тоста:

catch (java.net.SocketTimeoutException e) {

    runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context, "Network Error : No Data Received.", Toast.LENGTH_SHORT).show();
                }
            });

}
catch (Exception e) {
    runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context,e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
}
person Janki Gadhiya    schedule 19.04.2016
comment
Как работает этот код, если исключение не перехвачено java.net.SocketTimeoutException. - person Rushvi; 20.04.2016
comment
Я тестирую этот код, используя только Wi-Fi без подключения к Интернету, поэтому соединение не устанавливается в течение тайм-аута, поэтому должно отображаться сообщение «Нет данных получено»… но я его не получил. - person Rushvi; 20.04.2016
comment
Ниже этого предложения есть еще одно предложение catch. Исключение будет перехвачено им. Попробуйте напечатать то же самое в предложении catch ниже. Я думаю, что SocketTimeOut не поднимается. - person Janki Gadhiya; 20.04.2016
comment
Исключение перехватывается другим блоком исключений и выдает там неизвестную ошибку хоста. - person Rushvi; 20.04.2016
comment
Это означает, что это не исключение тайм-аута. Что-то не так с вашим URL. проверьте, загрузив его в браузер. - person Janki Gadhiya; 20.04.2016