2010-08-14 47 views
5

我在我的活動中有以下內容,用於在他們的LoveFilm隊列中下載用戶電影,但ProgressDialog從不出現。ProgressDialog不出現

public class MyListActivity extends Activity { 
    SharedPreferences prefs; 
    ProgressDialog m_progressDialog; 
    Thread listThread; 
    User user; 

    private Runnable threadProc_initializeQueue = new Runnable() { 
     public void run() { 
      user.fetchQueues(); 
      Queue defaultQueue = user.getDefaultQueue(); 
      defaultQueue.fetchTitles(); 

      m_progressDialog.dismiss(); 
     } 
    }; 

    /* (non-Javadoc) 
    * @see android.app.Activity#onCreate(android.os.Bundle) 
    */ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     prefs = getSharedPreferences(getString(R.string.app_name), MODE_PRIVATE); 

     // Authenticate the user if needs be. 
     if(!prefs.getBoolean("isAuthenticated", false)) { 
      Intent i = new Intent(this, OAuthActivity.class); 
      startActivity(i); 
      finish(); 
     } else { 
      // Get the users default list. 
      LoveDroid app = (LoveDroid) getApplication(); 
      user = new User(app); 

      m_progressDialog = ProgressDialog.show(MyListActivity.this, "Please Wait", "Loading", true); 
      listThread = new Thread(null, threadProc_initializeQueue); 
      listThread.run(); 
     } 

    } 

我見過別人這個問題,他們基本上都避開推薦一行看起來像我

m_progressDialog = ProgressDialog.show(MyListActivity.this, "Please Wait", "Loading", true); 

代碼的其餘產品,用戶薄膜通過下載線程,但對話框永遠不會顯示出來,它也需要幾秒鐘的時間,這並不像對話框在有時間出現之前就被解散了。

回答

7

它的更好,如果你使用AsyncTask(而不是線程 - 這通常是在Android的活動很好的做法)。

創建一個AsyncTask類,然後在該類上的onPreExecute上添加進度對話框,並在onPostExecute上關閉它。 您可以找到一個示例here

除此之外,還有在你的代碼的一些問題:

  1. 調用ProgressDialog.show(...)在的onCreate(...)通常是有問題的(因爲你不會看到它直到onCreate完成,這通常是在你的後臺活動完成之後)。
  2. 進度對話框上的所有操作都應該只在UI線程上執行,所以你不能在某個隨機線程上使用m_pd.dismiss()(這就是爲什麼你應該使用AsyncTask)。
+0

我將不得不看看AsyncTask類 - 我從來沒有用過它,它看起來非常有幫助。通過進度對話框,dismiss()調用實際上可以從任何線程調用,但其餘的方法需要從UI線程調用。 – 2010-08-15 01:16:30

+0

你在Amitlicht的位置,我用一個AsyncTask&eveything替換了Thread,因爲它非常適合,非常感謝。 – 2010-08-15 12:53:59

+0

但是然後對話框對象是preExecute方法的本地? – 2012-07-13 10:06:56

1

如果您撥打this而不是MyListActivity.this,該怎麼辦?

雖然不太可能,因爲它位於onCreate()內,但它不會從UI線程調用。

嘗試,圍繞着runOnUiThread(電話):

Activity me = this; 
    runOnUiThread(new Runnable() 
    { 
     public void run() 
     { 
      m_progressDialog = ProgressDialog.show(me, "Please Wait", "Loading", true); 
     } 
    });