Android Java - сбой HttpURLConnection без выдачи исключения - PullRequest
0 голосов
/ 09 октября 2018

Я запускаю HTTPUrlConnection в AsyncTask для извлечения данных JSON из API, но кажется, что это просто дает сбой и приводит к сбою моего приложения, не затрагивая мой код catch / finally.Следует отметить, что URL-адрес - https, и если я изменяю его на http, я получаю сообщение о том, что общение в незашифрованном виде запрещено (и то же самое, если я использую любой URL-адрес для этого подключения, даже просто https://www.google.comпротив http://www.google.com, так что, может быть, есть что-то в этом роде.)

В любом случае, я не знаю, как поступить.Если я помещаю запись в журнал в каждой строке, это останавливается и завершается сбоем в строке getResponseCode (), а если я удаляю это, то сразу останавливается и завершается сбоем в строке getInputStream ().Нет разницы, если я уберу таймауты.Любая помощь будет оценена.

public static String getResponseFromHttpUrl(URL url) throws IOException {
    HttpURLConnection urlConnection = null;
    try {
        urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.setConnectTimeout(500);
        urlConnection.setReadTimeout(500);

        int statusCode = urlConnection.getResponseCode();

        InputStream in = urlConnection.getInputStream();

        Scanner scanner = new Scanner(in);

        scanner.useDelimiter("\\A");

        boolean hasInput = scanner.hasNext();

        if (hasInput) {
            return scanner.next();
        } else {
            return null;
        }
    }
    catch(Exception ex){
        Log.d("NetworkUtils", "error in HTTP request");
        return null;
    }
    finally {
        Log.d("NetworkUtils", "before disconnect");
        if(urlConnection != null) {
            urlConnection.disconnect();
        }
    }
}

1 Ответ

0 голосов
/ 09 октября 2018

так что вот функционал AsyncTask, который не выдает NetworkOnMainThreadException:

public class UrlConnectionTask extends AsyncTask<Bundle, Integer, String> {

    private HttpURLConnection urlConnection = null;
    private URL url = null;

    public UrlConnectionTask(String spec) {
        try {
            this.url = new URL(spec);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected String doInBackground(Bundle... bundles) {
        StringBuilder result = new StringBuilder();
        if(this.url != null) {
            try {

                this.urlConnection = (HttpURLConnection) url.openConnection();
                this.urlConnection.setConnectTimeout(5000);
                this.urlConnection.setReadTimeout(5000);

                if(this.urlConnection.getResponseCode() == 200) {
                    InputStream is = this.urlConnection.getInputStream();
                    BufferedReader r = new BufferedReader(new InputStreamReader(is));
                    String inputLine;
                    while ((inputLine = r.readLine()) != null) {
                        result.append(inputLine);
                    }
                    is.close();
                    t.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
        return result.toString();
    }

    @Override
    protected void onPostExecute(String result) {
        System.out.println(result);
        if (this.urlConnection != null) {
            this.urlConnection.disconnect();
        }
    }
}

как есть, для вызова с new UrlConnectionTask("https://www.google.com").execute(); - если вы хотите вернуть HTML;вам нужно будет передать слушателя в его конструктор - и затем вызвать один из методов слушателя на onPostExecute().Можно также проверить, была ли переданная строка URL-адреса допустимой, и затем отменить задачу - или вызвать прослушиватель ошибок, когда ответ HTTP не был 200.

...