摆脱记忆

时间:2019-03-13 14:54:22

标签: android mpandroidchart

这是我的刷新图表数据的代码:

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:后台并发复制GC释放了661970(20MB)AllocSpace对象,0(0B)个LOS对象,57%空闲,8MB / 20MB,已暂停855us,总计101.178ms

一段时间后会因OOM错误而崩溃。
谁可以帮助我?

1 个答案:

答案 0 :(得分:1)

  

我的控制台中有很多这样的错误:

     

I / zygote64:释放了后台并发复制GC 661970(20MB)   AllocSpace对象,0(0B)个LOS对象,57%空闲,8MB / 20MB,已暂停   855us共101.178ms

这不是错误,这只是为您提供了为应用程序分配/释放新内存的信息。当分配大量内存或由于没有更多引用而释放内存时,会发生这种情况。

此消息经常出现时,表明您的应用程序中的内存处理不正确。

  

一段时间后会因OOM错误而崩溃。

这意味着您的应用程序内存不足。当您尝试分配设备上不可用(或JVM不提供)的内存时,会发生这种情况。

您现在应该做的是找出分配大量内存的位置以及是否存在其他减少内存使用量的选项。一些简单的方法可能是:

  • 仅在必要时使用全局(静态)变量
  • 免费资源,只要您不再需要它们(例如回收位图)
  • 检查代码是否可以优化以使用更少的资源。有时,例如,相同的数据位于两个不同的数组中。
  • 如果所有这些都无济于事,您可以尝试通过在AndroidManifest中设置android:largeHeap="true"来增加堆大小。但这仅应视为最后一步。请记住,不同的设备和android版本为您的应用程序提供不同的内存量。