2017-08-24 87 views
1

我使用費爾南多cejas'清潔機器人樣板代碼爲我的項目和 實施火力實時數據庫到我的項目,但是,當我調試我的代碼,我看到我的發射器是配置每次onDataChange ()被調用(當我添加一個新的行到我的firebase數據庫),我的用戶界面不是呈現新的列表內容,這裏是我的數據模塊代碼,有什麼建議嗎?清潔架構rxjava火力點實施

@Override 
public Observable<List> signalEntityList() { 

Firebase myFirebaseRef = new Firebase("https://mydatabase.firebaseio.com/"); 

return Observable.create(emitter -> { 

    if (isThereInternetConnection()) { 

    myFirebaseRef.child("signal").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
     List<SignalEntity> list = new ArrayList<>(); 

     Iterable<DataSnapshot> snapshotIterable = snapshot.getChildren(); 
     Iterator<DataSnapshot> iterator = snapshotIterable.iterator(); 

     while (iterator.hasNext()) { 
      SignalEntity signalEntity = iterator.next().getValue(SignalEntity.class); 
      list.add(signalEntity); 
     } 

     emitter.onNext(list); 
     emitter.onComplete(); 
     } 

     @Override 
     public void onCancelled(FirebaseError error) { 
     emitter.onError(new FirebaseException(error.getMessage())); 
     } 
    }); 
    } else { 
    emitter.onError(new NetworkConnectionException()); 
    } 
}); 
} 
+1

您在數據更改時調用'emmitter.onComplete'。我認爲可觀察項目在完成時即被處置。 – masp

+0

比你先生,我覺得問題解決了。我不能夠感謝你,節省了很多時間。 –

+0

@masp,請您將您的評論作爲答案寫下,我會接受您的答覆作爲接受的答案。謝謝。 –

回答

1

如果你打電話onComplete()你告訴Observable完成它的工作。然後你正在訂閱 - 你馬上就可以觀察完成。 試着去除它,我想你會得到你想要的結果。 順便說一句,嘗試將您的列表平面映射到可迭代的Observable。

@Override 
public Observable<SignalEntity> signalEntityList() { 

Firebase myFirebaseRef = new Firebase("https://mydatabase.firebaseio.com/"); 

Observable<List<SignalEntity>> obs = Observable.create(emitter -> { 

    if (isThereInternetConnection()) { 

    myFirebaseRef.child("signal").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
     List<SignalEntity> list = new ArrayList<>(); 

     Iterable<DataSnapshot> snapshotIterable = snapshot.getChildren(); 
     Iterator<DataSnapshot> iterator = snapshotIterable.iterator(); 

     while (iterator.hasNext()) { 
      SignalEntity signalEntity = iterator.next().getValue(SignalEntity.class); 
      list.add(signalEntity); 
     } 

     emitter.onNext(list); 
     } 

     @Override 
     public void onCancelled(FirebaseError error) { 
     emitter.onError(new FirebaseException(error.getMessage())); 
     } 
    }); 
    } else { 
    emitter.onError(new NetworkConnectionException()); 
    } 
}); 

return obs.flatMap(list -> {new Observable.from(list)}) 
} 
+0

hello @Scrobot,我沒有太多的rxjava背景,那麼你能解釋一下爲什麼要使用flatmap及其對我的情況的好處嗎?謝謝。 –

+1

你好。當您使用Observable時,如果您要處理的所有數據都可以表示爲Observable,而不是Observable和其他類型的混合,則可能會更方便。這使您可以使用一組操作員來管理數據流的整個生命週期。例如,可疑事件可以被認爲是一種同步的Observable。 – Scrobot

+1

這意味着,您可以使用單個模型項目並將其應用到您需要的所有操作員。如果你想映射你的數據 - 你將映射可迭代的項目,但如果它是列表 - 你必須調用這張map labmda-exprassion中的foreach迭代列表。閱讀你的代碼並不舒服。我希望你會明白我的意思) – Scrobot