我的应用程序实现了一个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