2

私のアプリには、ソケット接続の確立を担当するサービス(サービスを拡張)があり、firebaseネイティブAndroidフレームワークを使用して着信ネットワークトラフィックをリッスンします。これがどのように見えるかです

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);
}
}

ご覧のとおり、onStartCommand は START_NOT_STICKY を返すため、アプリを終了してもすぐにサービスが強制終了されることはありません (バックグラウンド - 中央ボタン)。

AppHelper の仕組みは次のとおりです。

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;
}
}

各コントローラーは、firebase リスナーを対応するノードに登録します. 基本クラスは次のようになります.

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();
}
}

それで、これが何が起こっているかです。アプリをバックグラウンドのままにして戻ってきても、すべてうまく機能します。他のアプリケーションを起動したり、デバイスをロックしたりすることもできます。戻ってきて、firebase は応答しません。アプリはクラッシュしませんが、何もしません。オフラインのままです。私は何かが収集されていると推測しています。しかし、それが何であるかはわかりません。

私はこれを試しました

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);

また、firebase が切断されるたびに、ユーザーのフラグメントにメッセージを表示しました。10 分後にアプリに戻ると、このメッセージは表示されません (firebase は接続されていますか?)。

前もって感謝します!。

4

0 に答える 0