1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-21 11:54:15 +01:00

AndroidGCS: Use a WeakReference to stop the OPTelemetryService handle leaking.

This commit is contained in:
James Cotton 2012-08-10 00:37:12 -05:00
parent 37c4880fba
commit 78469aa6a4

View File

@ -27,6 +27,7 @@
package org.openpilot.androidgcs.telemetry; package org.openpilot.androidgcs.telemetry;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.Observable; import java.util.Observable;
import java.util.Observer; import java.util.Observer;
@ -83,14 +84,25 @@ public class OPTelemetryService extends Service {
private final IBinder mBinder = new LocalBinder(); private final IBinder mBinder = new LocalBinder();
private final class ServiceHandler extends Handler { static class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) { private final WeakReference<OPTelemetryService> mService;
ServiceHandler(OPTelemetryService service, Looper looper) {
super(looper); super(looper);
mService = new WeakReference<OPTelemetryService>(service);
} }
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg)
if (DEBUG) {
Log.d(TAG, "handleMessage: " + msg); OPTelemetryService service = mService.get();
if (service != null) {
service.handleMessage(msg);
}
}
}
void handleMessage(Message msg) {
switch(msg.arg1) { switch(msg.arg1) {
case MSG_START: case MSG_START:
stopSelf(msg.arg2); stopSelf(msg.arg2);
@ -144,14 +156,13 @@ public class OPTelemetryService extends Service {
break; break;
case MSG_TOAST: case MSG_TOAST:
Toast.makeText(OPTelemetryService.this, (String) msg.obj, Toast.LENGTH_SHORT).show(); Toast.makeText(this, (String) msg.obj, Toast.LENGTH_SHORT).show();
break; break;
default: default:
System.out.println(msg.toString()); System.out.println(msg.toString());
throw new Error("Invalid message"); throw new Error("Invalid message");
} }
} }
};
/** /**
* Called when the service starts. It creates a thread to handle messages (e.g. connect and disconnect) * Called when the service starts. It creates a thread to handle messages (e.g. connect and disconnect)
@ -160,15 +171,12 @@ public class OPTelemetryService extends Service {
public void startup() { public void startup() {
Toast.makeText(getApplicationContext(), "Telemetry service starting", Toast.LENGTH_SHORT).show(); Toast.makeText(getApplicationContext(), "Telemetry service starting", Toast.LENGTH_SHORT).show();
if (DEBUG)
Log.d(TAG, "startup()");
thread = new HandlerThread("TelemetryServiceHandler", Process.THREAD_PRIORITY_BACKGROUND); thread = new HandlerThread("TelemetryServiceHandler", Process.THREAD_PRIORITY_BACKGROUND);
thread.start(); thread.start();
// Get the HandlerThread's Looper and use it for our Handler // Get the HandlerThread's Looper and use it for our Handler
mServiceLooper = thread.getLooper(); mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper); mServiceHandler = new ServiceHandler(this, mServiceLooper);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(OPTelemetryService.this); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(OPTelemetryService.this);
if(prefs.getBoolean("autoconnect", false)) { if(prefs.getBoolean("autoconnect", false)) {
@ -190,16 +198,13 @@ public class OPTelemetryService extends Service {
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
// Currently only using as bound service // Currently only using as bound service
if (DEBUG)
Log.d(TAG, "onStartCommand()");
// If we get killed, after returning from here, restart // If we get killed, after returning from here, restart
return START_STICKY; return START_STICKY;
} }
@Override @Override
public IBinder onBind(Intent intent) { public IBinder onBind(Intent intent) {
if (DEBUG)
Log.d(TAG, "onBind()");
return mBinder; return mBinder;
} }
@ -360,7 +365,7 @@ public class OPTelemetryService extends Service {
mon.addObserver(new Observer() { mon.addObserver(new Observer() {
@Override @Override
public void update(Observable arg0, Object arg1) { public void update(Observable arg0, Object arg1) {
System.out.println("Mon updated. Connected: " + mon.getConnected() + " objects updated: " + mon.getObjectsUpdated()); if (DEBUG) Log.d(TAG, "Mon updated. Connected: " + mon.getConnected() + " objects updated: " + mon.getObjectsUpdated());
if(mon.getConnected() /*&& mon.getObjectsUpdated()*/) { if(mon.getConnected() /*&& mon.getObjectsUpdated()*/) {
Intent intent = new Intent(); Intent intent = new Intent();
intent.setAction(INTENT_ACTION_CONNECTED); intent.setAction(INTENT_ACTION_CONNECTED);
@ -439,8 +444,8 @@ public class OPTelemetryService extends Service {
mon.addObserver(new Observer() { mon.addObserver(new Observer() {
@Override @Override
public void update(Observable arg0, Object arg1) { public void update(Observable arg0, Object arg1) {
System.out.println("Mon updated. Connected: " + mon.getConnected() + " objects updated: " + mon.getObjectsUpdated()); if (DEBUG) Log.d(TAG, "Mon updated. Connected: " + mon.getConnected() + " objects updated: " + mon.getObjectsUpdated());
if(mon.getConnected() /*&& mon.getObjectsUpdated()*/) { if(mon.getConnected()) {
Intent intent = new Intent(); Intent intent = new Intent();
intent.setAction(INTENT_ACTION_CONNECTED); intent.setAction(INTENT_ACTION_CONNECTED);
sendBroadcast(intent,null); sendBroadcast(intent,null);