|
|
@ -3,13 +3,34 @@ package com.otaliastudios.cameraview; |
|
|
|
import android.os.Handler; |
|
|
|
import android.os.Handler; |
|
|
|
import android.os.HandlerThread; |
|
|
|
import android.os.HandlerThread; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.lang.ref.WeakReference; |
|
|
|
|
|
|
|
import java.util.WeakHashMap; |
|
|
|
|
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Class holding a background handler. |
|
|
|
* Class holding a background handler. |
|
|
|
* Using setDaemon right now but a better approach would be to have |
|
|
|
* We want them to survive configuration changes if there's still job to do. |
|
|
|
* start() and stop() callbacks here. TODO |
|
|
|
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
class WorkerHandler { |
|
|
|
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 HandlerThread mThread; |
|
|
|
private Handler mHandler; |
|
|
|
private Handler mHandler; |
|
|
|
|
|
|
|
|
|
|
|