Myアプリケーションは、ArrayList(約7000項目)にデータを読み込むためにChildEventListenerを実装しています。 各アイテムのchildAdded実行中、インターフェイスは完全にフリーズし、使用できません。 バックグラウンドで実行する方法はありますか?それはユーザビリティを損なわないでしょうか? 私は既にAsyncTaskとスレッドを使ってみましたが、とにかくアプリケーションがフリーズします。前もって感謝します。Firebase Listener freezes app ui
クラス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