2011-07-07 70 views
0

我使用的是標準的ProgressDialog實現:我設置了一個線程來運行一個長時間的任務,當它完成時它將關閉ProgressDialog。ProgressDialog.dismiss()和AlertDialog.show()之間的長延遲

@Override 
public void onCreate(Bundle bundle) { 

     super.onCreate(bundle); 

     context = this; 
     progress = ProgressDialog.show(this, "Running", "Please wait..", true, false); 
     progress.setOnDismissListener(new OnDismissListener() { 

      public void onDismiss(DialogInterface dialog) { 

       showResults(); 
      } 

     }); 

     new DeleteThread().start(); 
} 

和線程看起來是這樣的:

private class DeleteThread extends Thread { 

    public DeleteThread() {} 

    @Override 
    public void run() { 

     // long process during which we populate 
     // a LinearLayout with many other Views 
     progress.dismiss(); 
    } 
} 

而且在showResults()我們採取的LinearLayout現在充滿了意見,並將其設置爲AlertDialog的內容。

問題是,ProgressDialog消失了,並且還有很長一段時間(10-12秒),AlertDialog彈出之前什麼也沒有發生。有沒有辦法讓這個過渡瞬間?

回答

0

我打算冒險作爲新手Android開發人員的猜測,並建議雖然爲LinearLayout生成指針,但佈局本身並未填充內容,因此當您調用progress.dismiss( )

您可能必須在設置AlertDialogs內容之前呈現視圖。 http://developer.android.com/guide/topics/ui/how-android-draws.html可能在這方面有一些幫助,不幸的是我的筆記本電腦有HDD問題,所以我沒有安裝Android開發環境,也無法嘗試它。但我想在progress.dismiss()之前在LinearLayout上嘗試一個invalidate,我希望這有助於:S

+0

沒有運氣。我試過'無效()'和'postInvalidate()'以及'forceLayout()' – Snailer

1

我知道這個答案可能會遲一點來,但是到底是什麼。

我看到你正在觸發onDismiss回調中的showResults()方法。我建議你以相反的方式來做。要做到這一點,您可能需要使用AsyncTask類。

AsyncTask允許您輕鬆設置任務以在衍生線程中運行,在需要時更新進度條(不是必需的,但可能是您的情況很好),當然也可以在UI上運行一些代碼線程一旦產生的線程完成。對於你的情況,我會把你的layoutview填充到AsyncTask.doInBackground()方法中。然後,您需要在AsyncTask.onPostExecute()中添加showResults()方法調用。在onPostExecute()的底部,你應該關閉你的進度對話框。那應該給你你想要的結果。

作爲獎勵,您可能需要爲您的AsyncTask類創建構造函數,並將ProgressDialog的創建置於其中。這樣ProgressDialog將完全封裝在該類中,並且一切都很好,很乾淨。所以,這樣的事情:

class MyAsyncClass extends AsyncClass 
{ 
    ProgressDialog m_progress; 

    public MyAsyncClass() 
    { 
    m_progress = ProgressDialog.show(this, "Running", "Please wait..", true, false); 
    } 

    protected Long doInBackground(Object... data) { 
    // Do your long process of populating a LinearLayout with many other Views 
    } 

    protected void onPostExecute(Long result) { 
    showResults(); 
    m_progress.dismiss(); 
    } 
} 

注:以上需要一些額外的參數的類,但你的想法。

0

利用這樣的下方,使用一旦這樣做了關閉對話框的的AsyncTask:

final ProgressDialog progressDialog = new ProgressDialog(v.getContext()); 

progressDialog.setCancelable(false); 
progressDialog.setMessage(v.getContext().getText(R.string.defaultQuantities)); 
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
progressDialog.setMax(100); 

new CountDownTimer(250, 250) { 
    public void onTick(long millisUntilFinished) { 
    } 

    public void onFinish() { 
     if (progressDialog.getProgress() < 100) { 
     progressDialog.show(); 
     } 
    } 
}.start();