altosdroid: Convert handlers to use weakreferences
authorMike Beattie <mike@ethernal.org>
Sun, 26 Aug 2012 11:12:48 +0000 (23:12 +1200)
committerMike Beattie <mike@ethernal.org>
Sun, 26 Aug 2012 11:12:48 +0000 (23:12 +1200)
* Also renamed bluetooth start/stop methods

Signed-off-by: Mike Beattie <mike@ethernal.org>
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java

index c1b9c654cd59c163a53736277ba884a981324749..d23d504f4523a92e0a1eb9cc9e28cb850ca05a2c 100644 (file)
@@ -17,6 +17,7 @@
 
 package org.altusmetrum.AltosDroid;
 
+import java.lang.ref.WeakReference;
 import android.app.Activity;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
@@ -85,24 +86,28 @@ public class AltosDroid extends Activity {
 
 
        // The Handler that gets information back from the Telemetry Service
-       class IncomingHandler extends Handler {
+       static class IncomingHandler extends Handler {
+               private final WeakReference<AltosDroid> mAltosDroid;
+               IncomingHandler(AltosDroid ad) { mAltosDroid = new WeakReference<AltosDroid>(ad); }
+
                @Override
                public void handleMessage(Message msg) {
+                       AltosDroid ad = mAltosDroid.get();
                        switch (msg.what) {
                        case MSG_STATE_CHANGE:
                                if(D) Log.i(TAG, "MSG_STATE_CHANGE: " + msg.arg1);
                                switch (msg.arg1) {
                                case TelemetryService.STATE_CONNECTED:
-                                       mTitle.setText(R.string.title_connected_to);
-                                       mTitle.append(mConnectedDeviceName);
-                                       mSerialView.setText("");
+                                       ad.mTitle.setText(R.string.title_connected_to);
+                                       ad.mTitle.append(ad.mConnectedDeviceName);
+                                       ad.mSerialView.setText("");
                                        break;
                                case TelemetryService.STATE_CONNECTING:
-                                       mTitle.setText(R.string.title_connecting);
+                                       ad.mTitle.setText(R.string.title_connecting);
                                        break;
                                case TelemetryService.STATE_READY:
                                case TelemetryService.STATE_NONE:
-                                       mTitle.setText(R.string.title_not_connected);
+                                       ad.mTitle.setText(R.string.title_not_connected);
                                        break;
                                }
                                break;
@@ -110,17 +115,17 @@ public class AltosDroid extends Activity {
                                byte[] buf = (byte[]) msg.obj;
                                // construct a string from the buffer
                                String telem = new String(buf);
-                               mSerialView.append(telem);
+                               ad.mSerialView.append(telem);
                                break;
                        case MSG_DEVNAME:
                                // save the connected device's name
-                               mConnectedDeviceName = msg.getData().getString(KEY_DEVNAME);
-                               Toast.makeText(getApplicationContext(), "Connected to "
-                                                       + mConnectedDeviceName, Toast.LENGTH_SHORT).show();
+                               ad.mConnectedDeviceName = msg.getData().getString(KEY_DEVNAME);
+                               Toast.makeText(ad.getApplicationContext(), "Connected to "
+                                                       + ad.mConnectedDeviceName, Toast.LENGTH_SHORT).show();
                                break;
                        case MSG_TOAST:
                                Toast.makeText(
-                                               getApplicationContext(),
+                                               ad.getApplicationContext(),
                                                msg.getData().getString(KEY_TOAST),
                                                Toast.LENGTH_SHORT).show();
                                break;
index 2ee7fe583ebfdcdd93065cc6643ddbb6c7a1d788..1c0e94b3855ab2e7172dbb623e5272bff935c6b9 100644 (file)
@@ -17,6 +17,7 @@
 
 package org.altusmetrum.AltosDroid;
 
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -68,22 +69,25 @@ public class TelemetryService extends Service {
        LinkedBlockingQueue<AltosLine> telem;
 
        // Handler of incoming messages from clients.
-       class IncomingHandler extends Handler {
+       static class IncomingHandler extends Handler {
+               private final WeakReference<TelemetryService> service;
+               IncomingHandler(TelemetryService s) { service = new WeakReference<TelemetryService>(s); }
+
                @Override
                public void handleMessage(Message msg) {
+                       TelemetryService s = service.get();
                        switch (msg.what) {
                        case MSG_REGISTER_CLIENT:
-                               mClients.add(msg.replyTo);
+                               s.mClients.add(msg.replyTo);
                                if (D) Log.d(TAG, "Client bound to service");
                                break;
                        case MSG_UNREGISTER_CLIENT:
-                               mClients.remove(msg.replyTo);
+                               s.mClients.remove(msg.replyTo);
                                if (D) Log.d(TAG, "Client unbound from service");
                                break;
                        case MSG_CONNECT_TELEBT:
                                if (D) Log.d(TAG, "Connect command received");
-                               TeleBT_stop();
-                               TeleBT_start((BluetoothDevice) msg.obj);
+                               s.startAltosBluetooth((BluetoothDevice) msg.obj);
                                break;
                        default:
                                super.handleMessage(msg);
@@ -91,7 +95,7 @@ public class TelemetryService extends Service {
                }
        }
 
-       private void TeleBT_stop() {
+       private void stopAltosBluetooth() {
                if (mAltosBluetooth != null) {
                        mAltosBluetooth.close();
                        mAltosBluetooth = null;
@@ -99,7 +103,7 @@ public class TelemetryService extends Service {
                telem.clear();
        }
 
-       private void TeleBT_start(BluetoothDevice d) {
+       private void startAltosBluetooth(BluetoothDevice d) {
                mAltosBluetooth = new AltosBluetooth(d);
                mAltosBluetooth.add_monitor(telem);
        }
@@ -141,7 +145,7 @@ public class TelemetryService extends Service {
        public void onDestroy() {
 
                // Stop the bluetooth Comms threads
-               TeleBT_stop();
+               stopAltosBluetooth();
 
                // Demote us from the foreground, and cancel the persistent notification.
                stopForeground(true);