Как включить Source Cache в облачное обновление в реальном времени в архитектуре MVVM android - PullRequest
0 голосов
/ 08 декабря 2018

В моем приложении я использую архитектуру Android MVVM, поэтому для извлечения данных из облачного пожарного хранилища я использую слои, поэтому я создаю еще один класс ( FirebaseQueryLiveData ) для получения результата из пожарного хранилища.Так что с моим кодом я получаю обновление в реальном времени, но не могу добавить функцию Cache Source в firestore. Я хочу включить автономный режим, добавив кэш-память.Как добавить это.

ProductViewModel.java

public class ProductViewModel extends AndroidViewModel {
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private MediatorLiveData<List<ProductModel>> productListLiveData;
private FirebaseQueryLiveData liveData;
 public ProductViewModel(@NonNull Application application) {
        super(application);
    }
public LiveData<List<ProductModel>> getProductList() {
        productListLiveData = new MediatorLiveData<>();
        completeProductList();
        return productListLiveData;
    }
      private void completeProductList() {
     Query query =  db.collection("mainCollection").document("productList")
                .collection("productCollection");
        liveData = new FirebaseQueryLiveData(query);
        productListLiveData.addSource(liveData, new Observer<QuerySnapshot>() {
            @Override
            public void onChanged(QuerySnapshot queryDocumentSnapshots) {
                if (queryDocumentSnapshots!= null){
                    List<ProductModel> productModelList = new ArrayList<>();
                    for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots){
                        ProductModel model = documentSnapshot.toObject(ProductModel.class);
                        productModelList.add(model);                     
                    }productListLiveData.setValue(productModelList);
                }
            }
        });

}

FirebaseQueryLiveData.java

public class FirebaseQueryLiveData extends LiveData<QuerySnapshot> {

    private MyValueEventListener listener = new MyValueEventListener();
    private Query query;
    Source source = Source.CACHE;

    private boolean listenerRemovePending = false;
    private ListenerRegistration registration;
    private Handler handler = new Handler();
    private final Runnable removeListener = new Runnable() {
        @Override
        public void run() {
            registration.remove();
            listenerRemovePending = false;

        }
    };

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

    @Override
    protected void onActive() {
        super.onActive();
        if (listenerRemovePending){
            handler.removeCallbacks(removeListener);
        }else {
          registration=  query.addSnapshotListener(listener);
        }
        listenerRemovePending= false;
    }

    @Override
    protected void onInactive() {
        super.onInactive();
        handler.postDelayed(removeListener, 2000);
        listenerRemovePending=true;
    }

    private class MyValueEventListener implements EventListener<QuerySnapshot> {
        @Override
        public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
            setValue(queryDocumentSnapshots);
        }
    }
}

1 Ответ

0 голосов
/ 10 декабря 2018

Для Android и iOS в облачном хранилище по умолчанию включено автономное сохранение .Это означает, что ваше приложение будет работать в течение коротких или промежуточных периодов отключения.

И да, вы можете указать source с помощью DocumentReference.get (Source source) и Query.get (источник) методы.

По умолчанию get() пытается предоставить обновленные данные, когда это возможно, ожидая данныхс сервера, но он может вернуть кэшированные данные или потерпеть неудачу, если вы находитесь в автономном режиме и сервер не может быть достигнут.Это поведение может быть изменено с помощью параметра Source.

Таким образом, теперь мы можем передать в качестве аргумента DocumentReference или Query источник, чтобы мы могли принудительно получить данные изchache only вот так:

FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference docIdRef = db.collection("tests").document("fOpCiqmUjAzjnZimjd5c");
docIdRef.get(Source.CACHE).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
        //Get data from the documentSnapshot object
    }
});

В этом случае мы заставляем данные извлекаться только из кэша, но зачем использовать эту функцию, когда вы говорите, что хотите получать обновления в реальном времени?Так что для вашего случая использования я не понимаю, почему вы получите данные из кэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...