2016-07-06 76 views
0

在Android應用程序onCreate期間,我有一堆代碼可能在一些較舊的設備上很慢。我想在運行所有init代碼的同時顯示進度對話框。如果由onCreate調用,則Dialog將不會顯示,因爲進一步的代碼會阻止UI。所以它需要進入一個AsyncTask。顯示progressdialog不顯示在asyctask

這是我的任務。

class startupTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     pd = new ProgressDialog(mainContext); 
     pd.setMessage("Starting up. Please wait..."); 
     pd.setIndeterminate(true); 
     pd.setCancelable(false); 
     pd.show(); 

     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      public void run() { 
       pd.show(); 
       runInit(); 
      } 
     }); 
     return null; 
    } 

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

但是對話框仍然不顯示? runInit是通常的慢啓動代碼。它需要在用戶界面上運行。

如果我刪除了pd.dismiss調用,進程對話框會在初始代碼完成後出現,所以它正在創建好,只是不顯示。

根據其他帖子,上述代碼是正確的方式來做到這一點,但是當從onCreate調用它似乎並沒有工作?

任何方法來強制顯示對話後顯示一個對話框?任何方式我可以讓對話框顯示並等待,直到它可見之後再繼續?

感謝您的任何幫助。

編輯:最後,我只好咬住子彈並重新組織代碼,以便只有慢的非UI代碼是在AsyncTask內。這讓它工作。

+0

你爲什麼要叫'pd.show();''在doInBackground'? – Sharj

+0

只是試圖讓對話框顯示。它沒有幫助。 – Some1Else

+1

你的問題是在語句「runInit是通常的慢啓動代碼,它需要在用戶界面上運行」。這就違背了將這些東西移出UI線程的asynctask的目的。描述runInit()在做什麼,並且有人可以幫助您找到在UI線程之外執行的方法。 – alzee

回答

0

你的runInit在做什麼?你正在UI線程上運行,它以同樣的方式被阻塞。

+0

是的,runInit是(並且需要)在UI線程上運行。在運行UI三維代碼之前,有沒有其他方法可以獲取progressdialog? – Some1Else

+0

進度正在顯示,但之後被阻止,我不應該在用戶界面上運行此操作,或者您沒有遵循最佳做法。爲了幫助我們需要runInit正在做什麼的信息。 –

0

onPreExecute(),onPostExecute()和onProgressUpdate()有權訪問UI線程,但doInBackground()不能。

如果runInit()在UI上執行了某些操作,它將被阻止,並且可能會生成一個您將忽略的異常。

您應該對doInBackground執行操作並使用publishProgress()將onProgressUpdate()數據發送到您想要更新到UI/ProgressBar狀態的數據。

這裏有一個例子:

new AsyncTask<Void,Object,Void>() 
{ 
    @Override 
    protected Void doInBackground(Void... params) 
    { 
     Object[] _progress = new Object[]{"Decompressing", 1}; 
     publishProgress(_progress);    
    } 

    @Override 
    protected void onPostExecute(Void params) 
    { 

    } 
    @Override 
    protected void onPreExecute() 
    { 

    } 
    @Override 
    protected void onProgressUpdate(Object... values) 
    { 
     txtProgress.setText(values[0].toString()); 
     progressBar.setProgress(Integer.parseInt(values[1].toString())); 
    } 
}.execute();