2010-08-14 46 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); 
     } 
    });