Где утечка памяти? - PullRequest
       35

Где утечка памяти?

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

Я пытаюсь загрузить исходный код страницы.Но когда я запускаю код, он работает вечно, и журнал показывает что-то подобное навсегда.

GC_FOR_ALLOC освобожден 274K, 13% свободен 6863K / 7815K, приостановлен 0ms

Вот мой код:

class downloadSource extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        String line = "";
        int x;
        try {
            URL url = new URL(params[0]);
            InputStream inputStream = url.openStream();
            InputStreamReader reader = new InputStreamReader(inputStream);
            x = reader.read();
            while (x != -1) {
                char c = (char) x;
                x = reader.read();
                line += c;

            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return line;
    }

И я называю это так из метода OnCreate:

    downloadSource task2=new downloadSource();
    String source = "";
    try {
         source = task2.execute("https://www.imdb.com/list/ls052283250/").get();
    } catch (ExecutionException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

Пожалуйста, помогите мне!Спасибо

1 Ответ

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

Ваша проблема, вероятно, не связана с утечкой памяти.Хотя ваш подход к чтению потока неэффективен, как упомянуто Хольгером , он также не является вашей главной проблемой.

Попробуйте добавить следующую строку в качестве первой строки в вашем onCreate:

System.setProperty("http.keepAlive", "false");

То, что происходило, состояло в том, что без установки этого свойства ваше соединение поддерживалось в ожидании большего числа запросов и возвращалось только по истечении времени ожидания.Если установить значение false, он вернется сразу после завершения вашего запроса.Чтобы лучше понять эту концепцию, прочитайте этот ответ: Как интерпретировать «Соединение: keep-alive, close»? .

Что касается неэффективного чтения потока, я бы порекомендовал вам изменить вашу реализациюк чему-то похожему на следующий код:

URL url = new URL(params[0]);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuilder builder = new StringBuilder();
String current;
while ((current = reader.readLine()) != null) {
    builder.append(current);
}
line = builder.toString();
reader.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...