2016-11-04 38 views
0

我有一個片段類的按鈕單擊我應該顯示一個tableview與內容,這是取決於要顯示的內容的時間跨度爲4秒或更長。所以我想按鈕點擊後顯示progressDialog,並在我的方法執行後關閉。ProgressDialog片段類不會立即出現在按鈕單擊後

但是這個過程在延遲之後出現,就像tableview出現之後一樣。所以顯示進度條會有延遲。我嘗試了這麼多方法仍然沒有運氣。

下面是我正在嘗試的代碼。

@Override 
    public void onClick(final View v) { 

     switch (v.getId()) { 
     case R.id.btn_spreadsheetAddTable: { 
      //Some code 
     } 
      break; 

     case R.id.btn_horizontalAddTable: { 

      AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { 
       @Override 
       protected Void doInBackground(Void... params) { 

        return null; 
       } 

       @Override 
       protected void onPreExecute() { 
        mProgressDialog = new ProgressDialog(getActivity()); 
        mProgressDialog.setTitle("Processing..."); 
        mProgressDialog.setMessage("Please wait."); 
        mProgressDialog.setCancelable(false); 
        mProgressDialog.setIndeterminate(true); 
        mProgressDialog.show(); 
        displayAddTableView(editIsEnabled); 

       } 

       @Override 
       protected void onPostExecute(Void result) { 
        if (mProgressDialog!=null) { 
         mProgressDialog.dismiss(); 

        } 
       } 
      }; 
      task.execute((Void[])null); 



      editIsEnabled = false; 

     } 

private void displayAddTableView(boolean editEnabled) { 
//A code to display dynamic table with dynamic data 
} 
} 

我一直在嘗試通過以下網址也:

android - Progressbar Late Loading when button click

Loading Dialog, Progress Dialog on Button Click

ProgressDialog doesn't appear immediately

請幫我this.Thank你。

回答

0

可能是您的設備或模擬器很慢。你可以初始化進度對話框,然後再在onPreExecute顯示此:

ProgressDialog mProgressDialog; 
. 
. 
.  //in oncreate 
     mProgressDialog = new ProgressDialog(getActivity()); 
     mProgressDialog.setTitle("Processing..."); 
     mProgressDialog.setMessage("Please wait."); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.setIndeterminate(true); 


. 
. 
. 
protected void onPreExecute() { 
mProgressDialog.show(); 
+0

我試過了,仍然沒有工作。 – reetu

+0

您是使用模擬器還是設備進行測試? –

1

你說這是服藥4秒才能顯示。聽起來像你在做什麼應該在後臺線程中完成,而不是UI線程。也許你想在doInBackground執行displayAddTableView(editIsEnabled);,併發布任何UI更新。

mProgressDialog.show()導致郵件被張貼到UI消息隊列,這意味着如果你的UI線程正忙於displayAddTableView(editIsEnabled);,進度微調不會顯示(或將顯示一秒鐘,displayAddTableView(editIsEnabled);運行完畢後)。

+0

我試圖從doInBacground()和table.show中調用displayAddTableView(editIsEnabled),它在displayAddTableView(editIsEnabled)中移動到onPostExecute。然後我的微調器出現在按鈕點擊。但是,在給出下面的異常java.lang.RuntimeException時崩潰:無法在未調用Looper.prepare()的線程中創建處理程序。 – reetu

+0

更新UI的'displayAddTableView'中的任何內容都需要放在對'runOnUiThread()'的調用中。 – pathfinderelite

+0

@reetu表視圖也應該有一個'post'方法,它基本上做同樣的事情。 – pathfinderelite

0

我已經解決了這個問題,方法是在UIThread中添加一個toast並運行表設計代碼,因爲無法顯示進度,因爲我的自定義表和進度的設計都需要在同一個線程中運行。

@Override 
public void onClick(final View v) { 

    switch (v.getId()) { 
    case R.id.btn_spreadSheetAddRow: { 


     Toast.makeText(this, 
       "Loading", 
       Toast.LENGTH_SHORT).show(); 

     final Thread uiThread = new Thread(new Runnable() { 

      @Override 
      public void run() { 

       uiHandler.postDelayed(new Runnable() { 

        @Override 
        public void run() { 

         //Call the heavy table design code; 

         Toast.makeText(getApplicationContext(), 
           "Done", 
           Toast.LENGTH_SHORT).show(); 

        } 
       }, 80); 
      } 
     }); 
     uiThread.start(); 
    } 
     break;