我目前的活动包含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
中,但这只会让我的应用在我回击时崩溃。我也试过在这里使用另一个问题的代码,但它也没有用。当我从我的活动回来时,我真的不确定如何摧毁onBackPressed
或MainActivity
。我该如何解决这个问题?
使用的代码没有用:
Handler
MainActivity
Fragment
片段代码
@Override
public void onBackPressed() {
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onBackPressed();
//additional code
} else {
getFragmentManager().popBackStack();
}
}
答案 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);
}