Skip to content

Commit 12fa563

Browse files
Jonathan727halfhp
authored andcommitted
Fix app freeze when gridsteps are much larger than the actual plot range (halfhp#76)
1 parent a26e537 commit 12fa563

File tree

6 files changed

+218
-159
lines changed

6 files changed

+218
-159
lines changed

androidplot-core/src/main/java/com/androidplot/Plot.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,43 @@
1818

1919
import android.content.Context;
2020
import android.content.res.TypedArray;
21-
import android.graphics.*;
21+
import android.graphics.Bitmap;
22+
import android.graphics.Canvas;
23+
import android.graphics.Color;
24+
import android.graphics.Paint;
25+
import android.graphics.PorterDuff;
26+
import android.graphics.RectF;
2227
import android.os.Build;
2328
import android.os.Looper;
2429
import android.support.annotation.Nullable;
2530
import android.util.AttributeSet;
2631
import android.util.Log;
2732
import android.view.View;
33+
2834
import com.androidplot.exception.PlotRenderException;
29-
import com.androidplot.ui.*;
35+
import com.androidplot.ui.Anchor;
36+
import com.androidplot.ui.BoxModel;
3037
import com.androidplot.ui.Formatter;
38+
import com.androidplot.ui.HorizontalPositioning;
39+
import com.androidplot.ui.LayoutManager;
40+
import com.androidplot.ui.Resizable;
41+
import com.androidplot.ui.SeriesBundle;
42+
import com.androidplot.ui.SeriesRenderer;
43+
import com.androidplot.ui.Size;
44+
import com.androidplot.ui.SizeMode;
3145
import com.androidplot.ui.TextOrientation;
46+
import com.androidplot.ui.VerticalPositioning;
3247
import com.androidplot.ui.widget.TextLabelWidget;
33-
import com.androidplot.ui.SeriesRenderer;
3448
import com.androidplot.util.AttrUtils;
3549
import com.androidplot.util.DisplayDimensions;
3650
import com.androidplot.util.PixelUtils;
37-
import com.androidplot.ui.HorizontalPositioning;
38-
import com.androidplot.ui.VerticalPositioning;
39-
import com.halfhp.fig.*;
51+
import com.halfhp.fig.Fig;
52+
import com.halfhp.fig.FigException;
4053

4154
import java.lang.reflect.Field;
42-
import java.util.*;
55+
import java.util.ArrayList;
56+
import java.util.HashMap;
57+
import java.util.List;
4358

4459
/**
4560
* Base class for all Plot implementations.
@@ -406,7 +421,7 @@ public void run() {
406421
}
407422
pingPong.recycle();
408423
}
409-
});
424+
}, "Androidplot renderThread");
410425
}
411426
}
412427

androidplot-core/src/main/java/com/androidplot/util/Redrawer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public Redrawer(List<Plot> plots, float maxRefreshRate, boolean startImmediately
5858
this.plots.add(new WeakReference<>(plot));
5959
}
6060
setMaxRefreshRate(maxRefreshRate);
61-
thread = new Thread(this);
61+
thread = new Thread(this, "Androidplot Redrawer");
6262
thread.start();
6363
if(startImmediately) {
6464
start();

androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,25 +85,24 @@ public static RectRegion minMax(XYConstraints constraints, XYSeries... seriesArr
8585
for (XYSeries series : seriesArray) {
8686

8787
// if this is an advanced xy series then minMax have already been calculated for us:
88-
boolean isPreCalculated = false;
8988
if (series instanceof FastXYSeries) {
9089
final RectRegion b = ((FastXYSeries) series).minMax();
9190
if(b == null) {
91+
//this series doesn't currently have min or max region (might be empty)
9292
continue;
9393
}
9494
if(constraints == null || constraints.contains(b)) {
9595
bounds.union(b);
96+
continue;
9697
}
9798
}
98-
if (!isPreCalculated && series.size() > 0) {
99-
for (int i = 0; i < series.size(); i++) {
100-
final Number xi = series.getX(i);
101-
final Number yi = series.getY(i);
99+
for (int i = 0; i < series.size(); i++) {
100+
final Number xi = series.getX(i);
101+
final Number yi = series.getY(i);
102102

103-
// if constraints have been set, make sure this xy coordinate exists within them:
104-
if (constraints == null || constraints.contains(xi, yi)) {
105-
bounds.union(xi, yi);
106-
}
103+
// if constraints have been set, make sure this xy coordinate exists within them:
104+
if (constraints == null || constraints.contains(xi, yi)) {
105+
bounds.union(xi, yi);
107106
}
108107
}
109108
}

androidplot-core/src/main/java/com/androidplot/xy/FastLineAndPointRenderer.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
package com.androidplot.xy;
1818

1919
import android.graphics.Canvas;
20+
import android.graphics.Paint;
2021
import android.graphics.PointF;
2122
import android.graphics.RectF;
23+
import android.support.annotation.NonNull;
2224

2325
import com.androidplot.exception.PlotRenderException;
2426
import com.androidplot.ui.RenderStack;
@@ -36,6 +38,11 @@
3638
*/
3739
public class FastLineAndPointRenderer extends XYSeriesRenderer<XYSeries, FastLineAndPointRenderer.Formatter> {
3840

41+
/**
42+
* A line drawn by {@link Canvas#drawLines(float[], int, int, Paint)} must be defined by at
43+
* least four points {@code x0, y0, x1, y1}
44+
*/
45+
private static final int MINIMUM_NUMBER_OF_POINTS_TO_DEFINE_A_LINE = 4;
3946
private float[] points;
4047
List<Integer> segmentOffsets = new ArrayList<>();
4148
List<Integer> segmentLengths = new ArrayList<>();
@@ -94,10 +101,14 @@ protected void onRender(Canvas canvas, RectF plotArea, XYSeries series, Formatte
94101
}
95102
}
96103

97-
protected void drawSegment(Canvas canvas, float[] points, int offset, int len, Formatter formatter) {
104+
protected void drawSegment(@NonNull Canvas canvas,
105+
@NonNull float[] points,
106+
int offset,
107+
int len,
108+
Formatter formatter) {
98109
if(formatter.linePaint != null) {
99110
// draw lines:
100-
if (len >= 4) {
111+
if (len >= MINIMUM_NUMBER_OF_POINTS_TO_DEFINE_A_LINE) {
101112
// optimization to avoid using 2x storage space to represent the full path:
102113
if ((len & 2) != 0) {
103114
canvas.drawLines(points, offset, len - 2, formatter.linePaint);
@@ -116,7 +127,9 @@ protected void drawSegment(Canvas canvas, float[] points, int offset, int len, F
116127
}
117128

118129
@Override
119-
protected void doDrawLegendIcon(Canvas canvas, RectF rect, Formatter formatter) {
130+
protected void doDrawLegendIcon(@NonNull Canvas canvas,
131+
@NonNull RectF rect,
132+
@NonNull Formatter formatter) {
120133
if(formatter.hasLinePaint()) {
121134
canvas.drawLine(rect.left, rect.bottom, rect.right, rect.top, formatter.getLinePaint());
122135
}

androidplot-core/src/main/java/com/androidplot/xy/SampledXYSeries.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void run() {
8989
lastResamplingException = ex;
9090
}
9191
}
92-
});
92+
}, "Androidplot XY Series Sampler");
9393
getZoomLevels().add(thisSeries);
9494
threads.add(thread);
9595
thread.start();

0 commit comments

Comments
 (0)