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:
parent
37c4880fba
commit
78469aa6a4
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user