aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/utils/StartableHandlerThread.java
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-03-26 15:19:03 +0100
committerSamuel Tardieu <sam@rfc1149.net>2014-03-26 15:19:03 +0100
commitb6e28fc56d7517116bfa9e13fcfd0424de26e04a (patch)
treea17ffb6f1eda4c7e6b2d236643157cd19e2f55ff /main/src/cgeo/geocaching/utils/StartableHandlerThread.java
parent6dd33e492d9123334ec0546414e574bbb10ad760 (diff)
downloadcgeo-b6e28fc56d7517116bfa9e13fcfd0424de26e04a.zip
cgeo-b6e28fc56d7517116bfa9e13fcfd0424de26e04a.tar.gz
cgeo-b6e28fc56d7517116bfa9e13fcfd0424de26e04a.tar.bz2
Put out as much sensor work as possible onto background threads
The sensors signals and merging are now delivered on background handler threads instead of the UI thread. While this might not change a lot of things in practice, it may help with #3680.
Diffstat (limited to 'main/src/cgeo/geocaching/utils/StartableHandlerThread.java')
-rw-r--r--main/src/cgeo/geocaching/utils/StartableHandlerThread.java80
1 files changed, 80 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/utils/StartableHandlerThread.java b/main/src/cgeo/geocaching/utils/StartableHandlerThread.java
new file mode 100644
index 0000000..152badc
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/StartableHandlerThread.java
@@ -0,0 +1,80 @@
+package cgeo.geocaching.utils;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Message;
+import org.eclipse.jdt.annotation.NonNull;
+import rx.Subscriber;
+import rx.functions.Action0;
+import rx.subscriptions.Subscriptions;
+
+/**
+ * Derivated class of {@link android.os.HandlerThread} with an exposed handler and a start/stop mechanism
+ * based on subscriptions.
+ */
+
+public class StartableHandlerThread extends HandlerThread {
+
+ private final static int START = 1;
+ private final static int STOP = 2;
+
+ static public interface Callback {
+ public void start(final Context context, final Handler handler);
+ public void stop();
+ }
+
+ private class StartableHandler extends Handler {
+ public StartableHandler() {
+ super(StartableHandlerThread.this.getLooper());
+ }
+
+ @Override
+ public void handleMessage(final Message message) {
+ if (callback != null) {
+ switch (message.what) {
+ case START:
+ callback.start((Context) message.obj, this);
+ break;
+ case STOP:
+ callback.stop();
+ break;
+ }
+ }
+ }
+ }
+
+ private Handler handler;
+ private Callback callback;
+
+ public StartableHandlerThread(@NonNull final String name, final int priority, final Callback callback) {
+ super(name, priority);
+ this.callback = callback;
+ }
+
+ public StartableHandlerThread(@NonNull final String name, final int priority) {
+ this(name, priority, null);
+ }
+
+ public Handler getHandler() {
+ if (handler == null) {
+ synchronized(this) {
+ if (handler == null) {
+ handler = new StartableHandler();
+ }
+ }
+ }
+ return handler;
+ }
+
+ public void start(final Subscriber<?> subscriber, final Context context) {
+ getHandler().obtainMessage(START, context).sendToTarget();
+ subscriber.add(Subscriptions.create(new Action0() {
+ @Override
+ public void call() {
+ getHandler().sendEmptyMessage(STOP);
+ }
+ }));
+ }
+
+}