我第二次初始化时LiveData查询未运行

时间:2019-04-05 07:45:40

标签: android firebase spinner android-livedata

我有一个不同的地雷清单。每个地雷都有一个黑名单。

我在微调器中有地雷,在recyclerview中有地雷。

每当用户在排雷器中更改排雷时,我想显示不同的块列表

我正在后端使用Firebase作为数据库。

当我在微调器中更改地雷时,我通过创建一个新的MutableLiveData来更新阻止列表,该类已在名为FirebaseQueryLiveData的类中扩展

我第一次使用包含地雷名称的查询初始化FirebaseQueryLiveData时,其中的所有事件都会触发。但是,在那之后,我称它为“火”。如果我在那里有断点,它将在构造函数中中断,但它永远不会到达ValueEventListener中的run()方法,onActive()方法或onDataChanged。

我已经做过一些研究,并且看到了用MutableLiveData替换LiveData的建议。我已经做到了,而且似乎没有什么不同。

有人可以在代码中看到任何我可能会丢失的东西吗?我对android体系结构组件不是很熟悉,并且我从另一个有用的网站上获得了FirebaseQueryLiveData类,该教程提供了教程,因此我努力了解自己出了问题的地方。

我已经做过一些研究,并且看到了用MutableLiveData替换LiveData的建议。我已经做到了,而且似乎没有什么不同。

    public class BlockListActivityViewModel extends ViewModel {

        private static DatabaseReference blockOutlineRef; // = FirebaseDatabase.getInstance().getReference(FireBasePaths.BLOCKOUTLINE.getPath("Therisa"));
        private static DatabaseReference mineListRef;

        private FirebaseQueryLiveData blockOutlineLiveDataQuery = null;
        private LiveData<BlockOutlineList> blockOutlineLiveData = null;

        private MediatorLiveData<String> selectedBlockNameMutableLiveData;

        private MediatorLiveData<ArrayList<String>> mineListMutableLiveData;

        public BlockListActivityViewModel() {

            User loggedInUser = UserSingleton.getInstance();

            setUpFirebasePersistance();
            setupMineLiveData(loggedInUser);
    //        setupBlockOutlineListLiveData();
        }

        private void setupBlockOutlineListLiveData(String mineName) {
            if (mineName != "") {
                blockOutlineRef = FirebaseDatabase.getInstance().getReference(FireBasePaths.BLOCKOUTLINE.getPath(mineName));

                blockOutlineLiveDataQuery = new FirebaseQueryLiveData(blockOutlineRef);
                blockOutlineLiveData = Transformations.map(blockOutlineLiveDataQuery, new BlockOutlineHashMapDeserialiser());
            }
        }

        private void setupMineLiveData(User user) {
            ArrayList<String> mineNames = new ArrayList<>();
            if (user != null) {
                if (user.getWriteMines() != null) {
                    for (String mineName : user.getWriteMines().values()) {
                        mineNames.add(mineName);
                    }
                }
            }

            setMineListMutableLiveData(mineNames);
            if (mineNames.size() > 0) {
                updateMineLiveData(mineNames.get(0));
            }
        }

        public void updateMineLiveData(String mineName) {
            SelectedMineSingleton.setMineName(mineName);
            setupBlockOutlineListLiveData(SelectedMineSingleton.getInstance());
        }

        public void setUpFirebasePersistance() {
            int i = 0;
    //        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
        }

        private MutableLiveData<NamedBlockOutline> selectedBlockOutlineMutableLiveData;

        public MutableLiveData<NamedBlockOutline> getSelectedBlockOutlineMutableLiveData() {

            if (selectedBlockOutlineMutableLiveData == null) {
                selectedBlockOutlineMutableLiveData = new MutableLiveData<>();

            }
            return selectedBlockOutlineMutableLiveData;
        }

        public void setSelectedBlockOutlineMutableLiveData(NamedBlockOutline namedBlockOutline) {
            getSelectedBlockOutlineMutableLiveData().postValue(namedBlockOutline);
        }

        public MediatorLiveData<String> getSelectedBlockNameMutableLiveData() {
            if (selectedBlockNameMutableLiveData == null)
                selectedBlockNameMutableLiveData = new MediatorLiveData<>();

            return selectedBlockNameMutableLiveData;
        }

        public void setSelectedBlockNameMutableLiveData(String blockName) {
            selectedBlockNameMutableLiveData.postValue(blockName);
        }

        public MediatorLiveData<ArrayList<String>> getMineListMutableLiveData() {
            if (mineListMutableLiveData == null)
                mineListMutableLiveData = new MediatorLiveData<>();

            return mineListMutableLiveData;
        }

        public void setMineListMutableLiveData(ArrayList<String> mineListString) {
            getMineListMutableLiveData().postValue(mineListString);
        }
    private class BlockOutlineHashMapDeserialiser implements Function<DataSnapshot, BlockOutlineList>, android.arch.core.util.Function<DataSnapshot, BlockOutlineList> {
        @Override
        public BlockOutlineList apply(DataSnapshot dataSnapshot) {

            BlockOutlineList blockOutlineList = new BlockOutlineList();
            HashMap<String, NamedBlockOutline> blockOutlineStringHashMap = new HashMap<>();

            for (DataSnapshot childData : dataSnapshot.getChildren()) {

                NamedBlockOutline thisNamedOutline = new NamedBlockOutline();
                HashMap<String, Object> blockOutlinePointHeader = (HashMap<String, Object>) childData.getValue();
                HashMap<String, BlockPoint> blockOutlinePoints = (HashMap<String, BlockPoint>) blockOutlinePointHeader.get("blockOutlinePoints");

                thisNamedOutline.setBlockName(childData.getKey());
                thisNamedOutline.setBlockOutlinePoints(blockOutlinePoints);

                blockOutlineStringHashMap.put(childData.getKey(), thisNamedOutline);
            }

            blockOutlineList.setBlockOutlineHashMap(blockOutlineStringHashMap);
            return blockOutlineList;
        }
    }

    @NonNull
    public LiveData<BlockOutlineList> getBlockOutlineLiveData() {
        return blockOutlineLiveData;
    }

}

LiveData

public class FirebaseQueryLiveData extends MutableLiveData<DataSnapshot> {
    private static final String LOG_TAG = "FirebaseQueryLiveData";

    private final Query query;
    private final MyValueEventListener listener = new MyValueEventListener();

    private boolean listenerRemovePending = false;
    private final Handler handler = new Handler();

    public FirebaseQueryLiveData(Query query) {
        this.query = query;
    }

    public FirebaseQueryLiveData(DatabaseReference ref) {
        this.query = ref;

    }

    private final Runnable removeListener = new Runnable() {
        @Override
        public void run() {
            query.removeEventListener(listener);
            listenerRemovePending = false;
            Log.d(LOG_TAG, "run");
        }
    };

    @Override
    protected void onActive() {
        super.onActive();
        if (listenerRemovePending) {
            handler.removeCallbacks(removeListener);
            Log.d(LOG_TAG, "listenerRemovePending");

        }
        else {
            query.addValueEventListener(listener);
            Log.d(LOG_TAG, "addValueEventListener");

        }
        listenerRemovePending = false;
        Log.d(LOG_TAG, "listenerRemovePending");

    }

    @Override
    protected void onInactive() {
        super.onInactive();
        // Listener removal is schedule on a two second delay
        handler.postDelayed(removeListener, 4000);
        listenerRemovePending = true;
        Log.d(LOG_TAG, "listenerRemovePending");

    }

    private class MyValueEventListener implements ValueEventListener {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            setValue(dataSnapshot);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(LOG_TAG, "Can't listen to query " + query, databaseError.toException());
        }
    }
}

0 个答案:

没有答案