问题
Here's the thing, my app has a service (extends Service) in charge of establishing a socket connection and listen for incomming network trafic using firebase native android framework. Here's what it looks like
public class SocketService extends Service {
private Firebase firebase;
@Override
public void onCreate() {
super.onCreate();
firebase = AppHelper.getInstance().getFirebase().child(AppHelper.getInstance().getFirebase().getAuth().getUid());
AppHelper.getInstance().categoriesController.setListeners(firebase.child("categories"));
AppHelper.getInstance().tablesController.setListeners(firebase.child("tables"));
AppHelper.getInstance().itemsController.setListeners(firebase.child("items"));
AppHelper.getInstance().requestsController.setListeners(firebase.child("requests"));
AppHelper.getInstance().ordersController.setListeners(firebase.child("orders"));
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
AppHelper.getInstance().categoriesController.removeListeners(firebase.child("categories"));
AppHelper.getInstance().tablesController.removeListeners(firebase.child("tables"));
AppHelper.getInstance().itemsController.removeListeners(firebase.child("items"));
AppHelper.getInstance().ordersController.removeListeners(firebase.child("orders"));
AppHelper.getInstance().requestsController.removeListeners(firebase.child("requests"));
AppHelper.getInstance().clearUserData();
AppHelper.getInstance().waiter = null;
AppHelper.getInstance().setConnectionState(false);
}
}
As you can see onStartCommand returns START_NOT_STICKY, so the service won't get killed as soon as I leave the app (on the background - middle button)
Here's how the AppHelper works:
public class AppHelper extends Application {
private static AppHelper instance = null;
private static Bus bus;
public TablesController tablesController;
public OrdersController ordersController;
public ItemsController itemsController;
public RequestsController requestsController;
public CategoriesController categoriesController;
private Firebase firebase;
public Waiter waiter;
private boolean connected = false;
public static AppHelper getInstance() {
return instance;
}
public Bus getBus() {return bus;}
@Override
public void onCreate() {
super.onCreate();
instance = this;
bus = new Bus();
tablesController = new TablesController(this);
ordersController = new OrdersController(this);
itemsController = new ItemsController(this);
requestsController = new RequestsController(this);
categoriesController = new CategoriesController(this);
Firebase.setAndroidContext(this);
firebase = new Firebase("https://restapp.firebaseio.com/");
// other setup code
}
public Firebase getFirebase() {
return firebase;
}
public void clearUserData() {
tablesController.clearData();
ordersController.clearData();
itemsController.clearData();
requestsController.clearData();
categoriesController.clearData();
}
public void setConnectionState(boolean connected) {
this.connected = connected;
bus.post(new NetworkStateEvent(connected));
}
public boolean isConnected() {
return connected;
}
}
Each controller registers a firebase listener to a corresponding node, Here's how the base class looks
public abstract class BaseController<T> {
protected Handler handler;
protected Firebase node;
protected ArrayList<T> models = new ArrayList<>();
protected ChildEventListener eventListener;
public BaseController(Context context) {
handler = new Handler(context.getMainLooper());
eventListener = getEventListener();
}
public void setListeners(Firebase node) {
this.node = node;
node.addChildEventListener(eventListener);
}
abstract ChildEventListener getEventListener();
public void removeListeners(Firebase node) {
models.clear();
node.removeEventListener(eventListener);
}
public ArrayList<T> getItems() {
return models;
}
public void clearData() {
models.clear();
}
}
So, here's whats happening. Everything works great, if you leave the app on background and come back it still works, you can even start other applications, lock the device etc etc. But, if you leave the app on background long enough (10 minutes or so) when you come back firebase won't respond. The app does NOT crash, but it doesn't do anything, it's as it was offline. I'm guessing something is getting gargabed collected. But I don't kwnow what that might be.
I tried This
connectedRef = new Firebase("https://restapp.firebaseio.com/.info/connected");
connectionStateListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
AppHelper.getInstance().setConnectionState(connected);
}
@Override
public void onCancelled(FirebaseError error) {
System.err.println("Listener was cancelled");
}
};
connectedRef.addValueEventListener(connectionStateListener);
And showed a message on the user's fragment whenever firebase get's disconnected. When I come back to app after 10 minutes, this message is not there ( that firebase is connected?).
Thank you in advance!.
来源:https://stackoverflow.com/questions/30397318/firebase-on-service-will-stop-working-afer-leaving-the-app-on-background-for-a