Firebase on service, will stop working afer leaving the app on background for a while

人走茶凉 提交于 2019-12-21 21:26:40

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!