Skip to content

Commit

Permalink
Fix: Remove WeakReference (#6)
Browse files Browse the repository at this point in the history
  • Loading branch information
sarweshkumar47 committed Aug 6, 2019
1 parent 082c9c8 commit c0be455
Showing 1 changed file with 36 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import com.makesense.labs.curvefit.models.MessageQueueData;
import com.makesense.labs.curvefit.utils.Constants;

import java.lang.ref.WeakReference;
import java.util.HashMap;

public final class CurveManager implements UiThreadCallback {
Expand All @@ -45,11 +44,11 @@ public final class CurveManager implements UiThreadCallback {

public CurveManager(GoogleMap map) {
mHandlerThread = new WorkerHandlerThread("HandlerThread");
mHandlerThread.setUiThreadCallback(this);
mHandlerThread.start();
mHandlerThread.setUiThreadCallback(this);

// Initialize the handler for Ui thread to handle messages from worker thread
mUiHandler = new UiHandler(Looper.getMainLooper(), this);
mUiHandler = new UiHandler(Looper.getMainLooper());
this.googleMap = map;
this.curves = new HashMap<>();
}
Expand All @@ -61,6 +60,12 @@ public void setOnCurveDrawnCallback(OnCurveDrawnCallback onCurveDrawnCallback) {
this.onCurveDrawnCallback = onCurveDrawnCallback;
}

/*
* Draws a curve, given options set in CurveOptions object.
* This method passes curveOptions object to the WorkerThread
* which computes all the intermediate points and invokes a
* callback once it is drawn.
*/
public void drawCurveAsync(CurveOptions curveOptions) {
addToRequestQueue(curveOptions);
}
Expand All @@ -69,47 +74,26 @@ public void drawCurveAsync(CurveOptions curveOptions) {
* Receives messages from handler thread after computing all intermediate points,
* draws curve on map and invokes callback if it is registered
*/
private static class UiHandler extends Handler {
private WeakReference<CurveManager> curveManagerWeakReference;
private CurveManager curveManager;
private class UiHandler extends Handler {

UiHandler(Looper looper, CurveManager manager) {
UiHandler(Looper looper) {
super(looper);
this.curveManagerWeakReference = new WeakReference<>(manager);
this.curveManager = curveManagerWeakReference.get();
}

// This method will run on UI thread
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case Constants.TASK_COMPLETE:
if (this.curveManager != null) {
CurveOptions curveOptions = (CurveOptions) msg.obj;
// Draws curve on map
Polyline real = curveManagerWeakReference.get().googleMap.
addPolyline(curveOptions.getReal());
Curve curve = new DelegatingCurve(real, curveManager);
curveManager.curves.put(real, curve);
if (curveManager.onCurveDrawnCallback != null) {
curveManager.onCurveDrawnCallback.onCurveDrawn(curve);
}
}
break;

default:
break;
}
}

void cleanup() {
if (curveManagerWeakReference != null) {
this.curveManagerWeakReference.clear();
this.curveManagerWeakReference = null;
}
if (curveManager != null) {
this.curveManager = null;
// Runs on UI thread
if (msg.what == Constants.TASK_COMPLETE) {
CurveOptions curveOptions = (CurveOptions) msg.obj;
// Draws curve on map
Polyline real = googleMap.addPolyline(curveOptions.getReal());
Curve curve = new DelegatingCurve(real, CurveManager.this);
curves.put(real, curve);
if (onCurveDrawnCallback != null) {
onCurveDrawnCallback.onCurveDrawn(curve);
}
}
}
}
Expand All @@ -121,36 +105,34 @@ public void setOnCurveClickListener(OnCurveClickListener onCurveClickListener) {
this.onCurveClickListener = onCurveClickListener;
if (googleMap != null) {
this.delegatingCurveClickListener = new DelegatingCurveClickListener(
onCurveClickListener, curves);
onCurveClickListener);
googleMap.setOnPolylineClickListener(delegatingCurveClickListener);
}
}

private static class DelegatingCurveClickListener implements GoogleMap.OnPolylineClickListener {
private class DelegatingCurveClickListener implements GoogleMap.OnPolylineClickListener {

private WeakReference<OnCurveClickListener> onCurveClickListenerWeakReference;
private WeakReference<HashMap<Polyline, Curve>> mapWeakReference;
private OnCurveClickListener onCurveClickListener;

DelegatingCurveClickListener(OnCurveClickListener curveClickListener,
HashMap<Polyline, Curve> curves) {
this.onCurveClickListenerWeakReference = new WeakReference<>(curveClickListener);
this.mapWeakReference = new WeakReference<>(curves);
DelegatingCurveClickListener(OnCurveClickListener curveClickListener) {
this.onCurveClickListener = curveClickListener;
}

@Override
public void onPolylineClick(Polyline polyline) {
onCurveClickListenerWeakReference.get().onCurveClick(mapWeakReference.get().get(polyline));
if (onCurveClickListener != null) {
onCurveClickListener.onCurveClick(curves.get(polyline));
}
}

void cleanup() {
this.onCurveClickListenerWeakReference = null;
this.mapWeakReference = null;
this.onCurveClickListener = null;
}
}

private void addToRequestQueue(CurveOptions options) {
if (options.getLatLngList().isEmpty() || options.getLatLngList().size() <= 1) {
throw new IllegalArgumentException("Requires atleast two latlong points");
throw new IllegalArgumentException("Requires at least two LatLng points");
}
MessageQueueData messageQueueData = new MessageQueueData(
options, googleMap.getProjection());
Expand All @@ -172,15 +154,14 @@ public void publishToUiThread(Message message) {
* Nullifies all references to avoid leaks
*/
public void unregister() {
if (curves != null) {
curves.clear();
curves = null;
}
if (mUiHandler != null) {
mUiHandler.removeMessages(Constants.TASK_COMPLETE, null);
mUiHandler.cleanup();
mUiHandler = null;
}
if (curves != null) {
curves.clear();
curves = null;
}
if (delegatingCurveClickListener != null) {
delegatingCurveClickListener.cleanup();
delegatingCurveClickListener = null;
Expand All @@ -196,13 +177,13 @@ public void unregister() {
googleMap = null;
}
if (mHandlerThread != null) {
boolean suc = mHandlerThread.quit();
mHandlerThread.quit();
mHandlerThread.setUiThreadCallback(null);
mHandlerThread = null;
}
}

protected final void onRemove(Polyline polyline) {
final void onRemove(Polyline polyline) {
curves.remove(polyline);
}

Expand Down

0 comments on commit c0be455

Please sign in to comment.