在AddValueListener上更新ProgressDialog从Firebase获取数据

时间:2017-07-23 16:36:39

标签: android firebase firebase-realtime-database progressdialog

我为我的应用启动了一个ProgressDialog,说“正在连接”。因此,添加我的Firebase数据库的监听器和onDataChange方法我想改变我的ProgressDialog的文本,例如“我已经连接,现在我正在下载数据”。稍后循环遍历数据库中的可迭代结果并隐藏ProgressDialog。

我的问题是ProgressDialog显示但我无法更新或更改消息。什么都没有。

我正在尝试使用RunOnUIThread,但没有任何效果。

你能帮助我达到我的目标,还是告诉我我无法做到的事情。

DialogHandler.showLoadingDialog(InitActivity.this, R.string.connecting,
                            "Connecting", true, false);
                    FDatabaseManager.getInstance().addListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            MyObject obj;
                            InitActivity.this.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    DialogHandler.updateLoadingDialog(R.string.downloading, "¡Ready! We're downloading data. Please wait.");
                                }
                            });
                            for (DataSnapshot i : dataSnapshot.getChildren()) {
                                obj= i.getValue(MyObject.class);
                                if (SQLiteManager.getInstance(InitActivity.this).existOn(SQLiteContract.TABLE_OBJS, obj.getId())) {
                                    ContentValues values = new ContentValues();
                                    values.put(SQLiteContract.ObjColumns.FIELD_LATITUDE, obj.getCoordinates().getLatitude());
                                    values.put(SQLiteContract.ObjColumns.FIELD_LONGITUDE, obj.getCoordinates().getLongitude());
                                    SQLiteManager.getInstance(InitActivity.this).insert(SQLiteContract.TABLE_OBJ, values);
                                }
                            }
                            DialogHandler.dismissLoadingDialog();
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            DialogHandler.dismissLoadingDialog();
                        }
                    }, Constants.DB_OBJS);

这是ProgressDialog的代码。

public static void showLoadingDialog(final Context context, final int title, final String message, final boolean indeterminate, final boolean cancelable) {
    dismissLoadingDialog();
    loadingDialog = new ProgressDialog(context);
    loadingDialog.setTitle(title);
    loadingDialog.setMessage(message);
    loadingDialog.setIndeterminate(indeterminate);
    loadingDialog.setCancelable(cancelable);
    loadingDialog.show();
}

public static void updateLoadingDialog(final int title, final String message) {
    if (loadingDialog != null && loadingDialog.isShowing()) {
        loadingDialog.setTitle(title);
        loadingDialog.setMessage(message);
    }
}

当我尝试在任何方法上执行此操作时,工作正常,但是当我尝试使用Firebase数据库的监听器时,无法正常工作。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您对听取数据的理解并不完全正确。附加侦听器时会开始下载数据。如果尚未建立连接,则建立连接。下载完成后会运行onDataChange()。另请注意,onDataChange()在Main / UI线程上运行,因此无需调用runOnUiThread()

onDataChange()方法中的SQLite查询和更新应该在不到一秒的时间内执行,可能大约200毫秒,因此在此期间不需要显示对话框。