Weak cache for threads

pull/29/head
Mattia Iavarone 8 years ago
parent 53bb5baf42
commit f3a14655b0
  1. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java
  2. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
  3. 25
      cameraview/src/main/utils/com/otaliastudios/cameraview/WorkerHandler.java

@ -35,7 +35,7 @@ abstract class CameraController implements Preview.SurfaceCallback {
mCameraCallbacks = callback;
mPreview = preview;
mPreview.setSurfaceCallback(this);
mHandler = new WorkerHandler("CameraViewController");
mHandler = WorkerHandler.get("CameraViewController");
}
//region Start&Stop

@ -117,7 +117,7 @@ public class CameraView extends FrameLayout {
mPreviewImpl = instantiatePreview(context, this);
mCameraController = instantiateCameraController(mCameraCallbacks, mPreviewImpl);
mUiHandler = new Handler(Looper.getMainLooper());
mWorkerHandler = new WorkerHandler("CameraViewWorker");
mWorkerHandler = WorkerHandler.get("CameraViewWorker");
// Views
mGridLinesLayout = new GridLinesLayout(context);

@ -3,13 +3,34 @@ package com.otaliastudios.cameraview;
import android.os.Handler;
import android.os.HandlerThread;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
/**
* Class holding a background handler.
* Using setDaemon right now but a better approach would be to have
* start() and stop() callbacks here. TODO
* We want them to survive configuration changes if there's still job to do.
*/
class WorkerHandler {
private static ConcurrentHashMap<String, WeakReference<WorkerHandler>> sCache = new ConcurrentHashMap<>(4);
public static WorkerHandler get(String name) {
if (sCache.containsKey(name)) {
WorkerHandler cached = sCache.get(name).get();
if (cached != null) {
HandlerThread thread = cached.mThread;
if (thread.isAlive() && !thread.isInterrupted()) {
return cached;
}
}
sCache.remove(name);
}
WorkerHandler handler = new WorkerHandler(name);
sCache.put(name, new WeakReference<>(handler));
return handler;
}
private HandlerThread mThread;
private Handler mHandler;

Loading…
Cancel
Save