Skip to content

Commit 43ae497

Browse files
committed
Fix some potential NPEs with WeakReference usage
Even if the WeakReference field is not null, the contained value may be null. Additionally, you always need a strong reference to the value to ensure it isn't garbage collected while you're using it.
1 parent 695f481 commit 43ae497

File tree

2 files changed

+27
-17
lines changed

2 files changed

+27
-17
lines changed

MPChartLib/src/main/java/com/github/mikephil/charting/renderer/LineChartRenderer.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,19 +76,21 @@ public void drawData(Canvas c) {
7676
int width = (int) mViewPortHandler.getChartWidth();
7777
int height = (int) mViewPortHandler.getChartHeight();
7878

79-
if (mDrawBitmap == null
80-
|| (mDrawBitmap.get().getWidth() != width)
81-
|| (mDrawBitmap.get().getHeight() != height)) {
79+
Bitmap drawBitmap = mDrawBitmap == null ? null : mDrawBitmap.get();
8280

83-
if (width > 0 && height > 0) {
81+
if (drawBitmap == null
82+
|| (drawBitmap.getWidth() != width)
83+
|| (drawBitmap.getHeight() != height)) {
8484

85-
mDrawBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(width, height, mBitmapConfig));
86-
mBitmapCanvas = new Canvas(mDrawBitmap.get());
85+
if (width > 0 && height > 0) {
86+
drawBitmap = Bitmap.createBitmap(width, height, mBitmapConfig);
87+
mDrawBitmap = new WeakReference<>(drawBitmap);
88+
mBitmapCanvas = new Canvas(drawBitmap);
8789
} else
8890
return;
8991
}
9092

91-
mDrawBitmap.get().eraseColor(Color.TRANSPARENT);
93+
drawBitmap.eraseColor(Color.TRANSPARENT);
9294

9395
LineData lineData = mChart.getLineData();
9496

@@ -98,7 +100,7 @@ public void drawData(Canvas c) {
98100
drawDataSet(c, set);
99101
}
100102

101-
c.drawBitmap(mDrawBitmap.get(), 0, 0, mRenderPaint);
103+
c.drawBitmap(drawBitmap, 0, 0, mRenderPaint);
102104
}
103105

104106
protected void drawDataSet(Canvas c, ILineDataSet dataSet) {
@@ -738,7 +740,10 @@ public void releaseBitmap() {
738740
mBitmapCanvas = null;
739741
}
740742
if (mDrawBitmap != null) {
741-
mDrawBitmap.get().recycle();
743+
Bitmap drawBitmap = mDrawBitmap.get();
744+
if (drawBitmap != null) {
745+
drawBitmap.recycle();
746+
}
742747
mDrawBitmap.clear();
743748
mDrawBitmap = null;
744749
}

MPChartLib/src/main/java/com/github/mikephil/charting/renderer/PieChartRenderer.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,21 @@ public void drawData(Canvas c) {
126126
int width = (int) mViewPortHandler.getChartWidth();
127127
int height = (int) mViewPortHandler.getChartHeight();
128128

129-
if (mDrawBitmap == null
130-
|| (mDrawBitmap.get().getWidth() != width)
131-
|| (mDrawBitmap.get().getHeight() != height)) {
129+
Bitmap drawBitmap = mDrawBitmap == null ? null : mDrawBitmap.get();
132130

133-
if (width > 0 && height > 0) {
131+
if (drawBitmap == null
132+
|| (drawBitmap.getWidth() != width)
133+
|| (drawBitmap.getHeight() != height)) {
134134

135-
mDrawBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444));
136-
mBitmapCanvas = new Canvas(mDrawBitmap.get());
135+
if (width > 0 && height > 0) {
136+
drawBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
137+
mDrawBitmap = new WeakReference<>(drawBitmap);
138+
mBitmapCanvas = new Canvas(drawBitmap);
137139
} else
138140
return;
139141
}
140142

141-
mDrawBitmap.get().eraseColor(Color.TRANSPARENT);
143+
drawBitmap.eraseColor(Color.TRANSPARENT);
142144

143145
PieData pieData = mChart.getData();
144146

@@ -1010,7 +1012,10 @@ public void releaseBitmap() {
10101012
mBitmapCanvas = null;
10111013
}
10121014
if (mDrawBitmap != null) {
1013-
mDrawBitmap.get().recycle();
1015+
Bitmap drawBitmap = mDrawBitmap.get();
1016+
if (drawBitmap != null) {
1017+
drawBitmap.recycle();
1018+
}
10141019
mDrawBitmap.clear();
10151020
mDrawBitmap = null;
10161021
}

0 commit comments

Comments
 (0)