@OM1

OkHttp и jsonObject: Почему происходит утечка памяти?

Здравствуйте, использую OkHttp для получения json с сервера в переменную, которая является адаптером для listView.
Данный алгоритм висит на TimerTask, т.е. это все происходит с постоянным интервалом. При отладке происходит либо утечка, либо что-то вроде этого.
Т.е. объем используемой памяти постоянно растет и не высвобождается.

Вот структура кода:

mTimer = new Timer();
    mMyTimerTask = new MyTimerTask();
    mTimer.schedule(mMyTimerTask, 1000, 10000);
		
	adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
    listView.setAdapter(adapter);
	
	get_data(){
		OkHttpHandler
		result = handler.execute(url).get();
		jsonObject = new JSONObject(result);
		jArr = jsonObject.getJSONArray("data");
		for(;;){
			items.add(jArr[i]);
		}
	}
	
	class MyTimerTask extends TimerTask {

        @Override
        public void run() {

            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    get_data();
                }
            });
        }
    }


Что не так?
Как вообще грамотно взять json с сервера и приаттачить к listview? Если есть возможность...поподробнее...
Есть смысл переходить на другие библиотеки для json запросов по http или для парсинга?
Имеет смысл работать с классом, назовем его data, в который писать данные после парсинга json или лучше работать через обычный массив, затем в listview?

Спасибо!
  • Вопрос задан
  • 260 просмотров
Пригласить эксперта
Ответы на вопрос 2
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Во-первых, что-то вы сделали не то со своим кодом, на джаве это не заведётся.
Во-вторых, вы в беcконечном цикле добавляете в список(?) элемент.
for(;;){
      items.add(jArr[i]);
    }

В третьих, у вас через таймер течёт класс, в котором всё это мракобесие происходит.
Имеет смысл использовать модель, в которую парсится ответ сервера. Парсящий код ничего не должен знать про листвью. Листвью ничего не должен знать про загрузку с сервера. Используйте MVP.
Ответ написан
Комментировать
@OM1 Автор вопроса
1. и 2. Вот структура кода, т.е. это просто БЛОКИ, это не рабочий код.
3. В таймере только вызов get запроса и парсинг
4. Парсер работает с массивом строк, ЛистВью подключен к этому массиву через адаптер. Запрос и парсинг связаны со списком только через адаптер.

Вот и вопросы:
1. куда уходит память: работаю только с одним массивом и листвью. Может, надо их "очищать"?
2. правильная ли у меня модель ( запрос, парсинг в массив, листвью заполняется этим массивом) ?

UPD:

JSON запрос через OkHttp обернул в отдельный класс JSONget, вызываю и парсю через AsyncTask в отдельный класс Data, по таймеру.
К лист вью прикрутил через адаптер типа: persons.add(new Person(name, text, img));
Потестил - вроде все ОК, память освобождается.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы