我的應用程序實現了一個ChildEventListener以將數據加載到ArrayList中(大約7000項)。 在每個項目的childAdded執行過程中,接口完全凍結,無法使用。 有沒有辦法在後臺運行它,並且不會影響可用性? 我已經嘗試過使用AsyncTask和線程,但應用程序仍然凍結。提前致謝。Firebase監聽器凍結應用程序用戶界面
類FBTask擴展AsyncTas {
@Override
protected Boolean doInBackground(final Boolean... params){
int size = 7000; //aprox,
final ArrayList<Model> aux = new ArrayList<>();
Query db = FirebaseDatabase.getInstance().getReference()
.child("List").orderByChild("Double");
ChildEventListener cEL = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Model x = dataSnapshot.getValue(Model.class);
if(x.getT()!=null) {
aux.add(x)
Log.i("onChildAdded", x.getId() + " Added, pos: " + dX.size());
if(aux.size()>=size) {
data = aux;
}
}
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
db.addChildEventListener(cEL);
}
@Override
protected void onProgressUpdate(Boolean... values) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(DownAdapter result) {
if(result != null) {
DownActivity.downRecView.setAdapter(result);
}
}
@Override
protected void onCancelled() {
}
}
我已經嘗試了asyncTask中的代碼,並且我甚至使用了輔助數組,並且一旦加載了所有元素都將加載輔助數據到主數組中但它仍然處於凍結狀態 – Benkasem
所有對'dataSnapshot.getValue(Model.class )'仍然在主線程上發生。爲了防止這種情況,您需要在'onChildAdded()'回調內創建後臺任務**。做7000次也不容易,所以我建議使用後臺服務來卸載工作。儘管如此,最好的解決方案仍然是一樣的:不要求提供7000個物品,或者至少一次。 –
我將聽衆放入服務中嗎?或者我必須在OnChildAdded – Benkasem