【问题标题】:Update ProgressDialog on AddValueListener getting data from Firebase在 AddValueListener 上更新 ProgressDialog 从 Firebase 获取数据
【发布时间】:2017-07-23 16:36:39
【问题描述】:

我为我的应用启动了一个 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 数据库的侦听器上进行操作时,则无法正常工作。

感谢您的帮助。

【问题讨论】:

    标签: android firebase firebase-realtime-database progressdialog


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多