Выйти из памяти

Это код данных моего графика обновления:

public void showLineChart(final List<String> xAxisValues, final List<List<String>> yAxisValues,
                              final List<String> labels, List<Integer> colours) {
        lineChart.resetTracking();
        final List<String> xa = new ArrayList<>(xAxisValues);
        markerView.setCallBack(new CustomMarkerView.CallBack() {
            @Override
            public void onCallBack(float x, String value) {
                int index = (int) (x);
                if (index < 0) {
                    return;
                }
                String textTemp = "";
                if (yAxisValues.size() > 1) {
                    textTemp = "室外:" + yAxisValues.get(1).get(index);
                    markerView.getTextViewOutdoor().setText(textTemp);
                    markerView.getLl().setVisibility(View.VISIBLE);
                }
                textTemp = "室内:" + yAxisValues.get(0).get(index);
                markerView.getTextViewIndoor().setText(textTemp);
                markerView.getTextViewDate().setText(xa.get(index));
                markerView.setAlpha((float) 0.7);
            }
        });

        MyCustomXAxisValueFormatter formatter = new MyCustomXAxisValueFormatter(xAxisValues);
        xAxis.setValueFormatter(formatter);
        List<ILineDataSet> dataSets = new ArrayList<>();
        for (int i = 0; i < yAxisValues.size(); i++) {
            List<Entry> entries = new ArrayList<>();
            List<String> values=new ArrayList<>(yAxisValues.get(i));
            if (values.size()>0){
                for (int j = 0; j < values.size(); j++) {
                    if (j >= xAxisValues.size()) {
                        j = xAxisValues.size() - 1;
                    }
                    if (j>-1&&values.get(j)!=null){
                        entries.add(new Entry(j, Float.parseFloat(values.get(j))));
                    }
                }
                if (i<labels.size()){
                    LineDataSet lineDataSet = new LineDataSet(entries, labels.get(i)); 
                    initLineDataSet(lineDataSet, colours.get(i), false);
                    dataSets.add(lineDataSet);
                }
            }
        }
        LineData data = new LineData(dataSets);
        xAxis.setLabelCount(xAxisValues.size(), true);
        lineChart.setData(data);
        lineChart.invalidate();
    }

Я прочитал демо-версию Github, но это не решает проблему:
В моей консоли так много ошибок:

I/zygote64: Background concurrent copying GC freed 661970(20MB) AllocSpace objects, 0(0B) LOS objects, 57% free, 8MB/20MB, paused 855us total 101.178ms

Через некоторое время произойдет сбой с ошибкой OOM.
Кто может мне помочь?

Проблема скорее не в этом коде, а в размере списков и частоте обновления.

Selvin 13.03.2019 16:02

@Selvin Я установил обновление каждые 60 секунд, а длина списка составляет 18

Machine 15.03.2019 10:47
1
2
189
1

Ответы 1

There are so many error in my console like this:

I/zygote64: Background concurrent copying GC freed 661970(20MB) AllocSpace objects, 0(0B) LOS objects, 57% free, 8MB/20MB, paused 855us total 101.178ms

Это не ошибка, это просто дает вам информацию о выделении/освобождении новой памяти для вашего приложения. Это происходит при выделении большого объема памяти или когда память освобождается из-за того, что на нее больше нет ссылок.

Если это сообщение появляется часто, это может указывать на неправильную обработку памяти в вашем приложении.

It will crash after a period of time with the OOM error.

Это означает, что вашему приложению не хватило памяти. Это происходит, когда вы пытаетесь выделить память, которая недоступна на вашем устройстве (или не предоставлена ​​JVM).

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

  • используйте глобальные (статические) переменные только там, где это необходимо
  • бесплатные ресурсы, как только они вам больше не нужны (например, перерабатывать растровые изображения)
  • проверьте свой код, если вы можете оптимизировать его, чтобы использовать меньше ресурсов. Иногда бывает, например, что одни и те же данные находятся внутри двух разных массивов.
  • если все это не помогает, вы можете попытаться увеличить размер кучи, установив android:largeHeap = "true" в своем AndroidManifest. Но это следует рассматривать только как последний шаг. Имейте в виду, что разные устройства и версии Android предоставляют вашему приложению разный объем памяти.

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

Machine 15.03.2019 10:49

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