2017-07-23 20 views
0

我爲我的應用程序啓動了一個ProgressDialog,聲明「正在連接」。因此,爲我的Firebase數據庫和onDataChange添加監聽器我想更改ProgressDialog的文本,例如「我已經連接,現在我正在下載數據」。稍後循環遍歷來自數據庫的迭代結果並隱藏ProgressDialog。更新AddValueListener上的ProgressDialog,從Firebase獲取數據

我的問題是ProgressDialog showns,但我不能讓它更新或更改消息。沒有。

我正在嘗試使用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); 
    } 
} 

當我試圖讓這對任何人的方法,工作正常,但是當我試圖讓在火力地堡數據庫,而不是作品的監聽器。

謝謝你的幫助。

回答

0

您對收聽數據的理解不太正確。數據的下載在您連接監聽器時開始。如果尚未建立連接,那麼此時會建立連接。下載完成時運行onDataChange()。另請注意,onDataChange()在Main/UI線程上運行,因此不需要撥打runOnUiThread()

您的onDataChange()方法中的SQLite查詢和更新應該在不到一秒的時間內執行,也許約200毫秒,因此在此期間顯示對話框不是必需的。