2012-07-14 70 views
0

我在這裏搜索了大部分「progressDialog不工作」的線程,但沒有一個答案似乎適用於我。Android的ProgressDialog不工作,當創建一個新的活動

我試圖創建一個新的活動,調用一個方法,在不同的線程上執行(需要30到50秒)。

public class FLActivity extends ListActivity { 

    private ProgressDialog mProgressDialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mProgressDialog = ProgressDialog.show(FLActivity.this, "", 
               "Loading..."); 

     OtherClass.LongDurationMethodWhichStartsAWorkedThread(); 

     mProgressDiagog.dismiss(); 
    } 
} 

長持續時間的方法是:

// in some other class 
public static LongDurationMethodWhichStartsAWorkedThread() { 
    Runnable r = new FFThread(); 
    Thread thread = new Thread(r); 

    thread.start(); 
    try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

我用的Thread.join()等待工作者線程來執行,然後繼續。

但是,不顯示任何消息。

任何人都可以看到問題嗎?

回答

1

LongDurationMethodWhichStartsAWorkedThread();將立即返回,因爲啓動線程不是阻塞呼叫。因此,可能發生的情況是您的進度對話框正在顯示,然後幾乎立即清除,這使您認爲它完全沒有顯示出來。

相反,您應該使用Thread/Handler或AsyncTask來實現您的長時間運行操作並顯示用戶進度。

This page has a nice overview如何實現它,雖然它當然不是唯一的選擇,谷歌搜索「AsyncTask示例」會給你很多選擇。

private class LongOperation extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     // perform long running operation operation 
     return null; 
    } 

    /* (non-Javadoc) 
    * @see android.os.AsyncTask#onPostExecute(java.lang.Object) 
    */ 
    @Override 
    protected void onPostExecute(String result) { 
     // execution of result of Long time consuming operation 
    } 

    /* (non-Javadoc) 
    * @see android.os.AsyncTask#onPreExecute() 
    */ 
    @Override 
    protected void onPreExecute() { 
    // Things to be done before execution of long running operation. For example showing ProgessDialog 
    } 

    /* (non-Javadoc) 
    * @see android.os.AsyncTask#onProgressUpdate(Progress[]) 
    */ 
    @Override 
    protected void onProgressUpdate(Void... values) { 
     // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog 
    } 
} 
+0

Hi Tim。幾個小時前我讀到,它沒有被指示使用AsyncTask進行超過幾秒鐘的操作。我的時間超過30秒。你認爲這會是一個問題嗎? – 2012-07-14 15:29:12

+0

我從來沒有見過任何說明,你能鏈接到你讀的地方嗎? – FoamyGuy 2012-07-14 19:46:53

1

問題是,當你從主線程調用thread.join()時,你的UI線程被阻塞。所以它不能顯示任何對話框,因爲它只是在等待工作線程完成。我可以推薦你兩件事情:在Activity.onCreateDialog helper方法

  1. 使用AsyncTask在後臺運行繁重的操作,這比創建自己的線程,並與UI線程同步它們更容易
  2. 創建所有的對話和使用活動讓他們.showDialog,這將幫助您處理配置更改。
相關問題