使用Activty onBackPressed内的图表处理程序销毁片段

时间:2018-04-30 23:05:25

标签: android android-fragments handler onbackpressed

我目前的活动包含web <- read_html(url) Error in doc_parse_file(con, encoding = encoding, as_html = as_html, options = options) : Expecting a single string value: [type=character; extent=9]. viewpager。在这些fragments中,获取的图表是从URL获取数据。要实现这一点,我必须添加fragments以延迟该过程,以便应用程序不会崩溃。没有它,数据加载速度不够快,所以我把它设置为3秒。我遇到的问题是当我Handler应用程序崩溃时,如果图表尚未加载。

我尝试将Backpress的{​​{1}}方法应用到我的override中,但这只会让我的应用在我回击时崩溃。我也试过在这里使用另一个问题的代码,但它也没有用。当我从我的活动回来时,我真的不确定如何摧毁onBackPressedMainActivity。我该如何解决这个问题?

使用的代码没有用:

Handler

MainActivity

Fragment

片段代码

@Override
 public void onBackPressed() {

int count = getFragmentManager().getBackStackEntryCount();

if (count == 0) {
    super.onBackPressed();
    //additional code
} else {
    getFragmentManager().popBackStack();
}
}

1 个答案:

答案 0 :(得分:0)

问题是您的片段存在内存泄漏。网络请求将返回不再存在的片段。您的处理程序将启动一个线程并尝试访问已被销毁的元素。你不应该使用固定时间的处理程序,如果你的请求需要超过3秒才能返回?只有在收到结果时才需要填写图表数据,将makechart方法更改为:

private void makeChart() {

    StringRequest req = new StringRequest(Request.Method.GET, URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {

                    Log.d(TAG, response.toString());

                    try {
                        jsonResponse = "";
                        JSONObject jObject = new JSONObject(response);
                        JSONArray jsonArray = jObject.getJSONArray("Data");
                        for (int i = 0; i <= jsonArray.length(); i++) {

                            JSONObject o = jsonArray.getJSONObject(i);

                            time = o.getString("time");
                            open = o.getString("close");

                            float val = Float.parseFloat(open);

                            yVals1.add(new Entry(i, val));

                            long unixSeconds = Long.parseLong(time);
                            Date date = new Date(unixSeconds * 1000L);
                            SimpleDateFormat sdf = new SimpleDateFormat("HH:MM");
                            sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
                            String formattedDate = sdf.format(date);

                            xValues.add(formattedDate);

                        }
                    //finished receiving data
                    fillChartData();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
        }
    });

    Graph_AppController.getInstance().addToRequestQueue(req); 
}

创建一个名为fillChartData的新方法,将所有处理程序代码移动到此方法,并在完成数据接收后调用它。这样你就不必使用处理程序了。

public void fillChartData(){
  mChart.setBackgroundColor(Color.WHITE);
                mChart.setGridBackgroundColor(Color.WHITE);
                mChart.setDrawGridBackground(true);
                mChart.setDrawBorders(true);

                Legend l = mChart.getLegend();
                l.setEnabled(false);

                XAxis xAxis = mChart.getXAxis();
                xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
                xAxis.setDrawGridLines(false);
                xAxis.setAxisLineColor(Color.BLACK);
                xAxis.setTextColor(Color.BLACK);

                xAxis.setValueFormatter(new DefaultAxisValueFormatter(0) {
                    @Override
                    public String getFormattedValue(float value, AxisBase axis) {
                        return xValues.get((int) value % xValues.size());
                    }

                    @Override
                    public int getDecimalDigits() {
                        return 0;
                    }
                });

                YAxis leftAxis = mChart.getAxisLeft();
                leftAxis.setTextColor(Color.BLACK);
                leftAxis.setDrawAxisLine(true);
                leftAxis.setDrawZeroLine(false);
                leftAxis.setDrawGridLines(false);
                leftAxis.setGridColor(Color.WHITE);
                leftAxis.setAxisLineColor(Color.BLACK);

                mChart.getAxisRight().setEnabled(false);
                LineDataSet set1;


                set1 = new LineDataSet(yVals1, "DataSet 1");

                set1.setAxisDependency(YAxis.AxisDependency.LEFT);
                set1.setMode(LineDataSet.Mode.CUBIC_BEZIER);
                set1.setColor(Color.parseColor("#008000"));
                set1.setDrawCircles(true);
                set1.setLineWidth(3f);
                set1.setCircleRadius(1f);
                set1.setCircleColor(Color.parseColor("#008000"));
                set1.setFillAlpha(50);
                set1.setDrawFilled(true);
                set1.setFillColor(Color.parseColor("#008000"));
                set1.setHighLightColor(Color.rgb(244, 117, 117));
                set1.setDrawCircleHole(false);

                dataSets.add(set1);

                LineData datab = new LineData(dataSets);
                datab.setDrawValues(false);

                mChart.setData(datab);
                mChart.setDrawMarkers(true);
                IMarker marker = new YourMarkerView(getContext(),R.layout.custom_marker);
                mChart.setMarker(marker);
}