ProgressDialog不会出现

时间:2010-08-14 17:11:17

标签: android

我的Activity中有以下内容,我用它来下载LoveFilm队列中的用户电影,但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);

其余的代码工作,用户电影通过线程下载,但对话框从不显示,也需要几秒钟,这不像对话框在它有时间出现之前被解雇。

2 个答案:

答案 0 :(得分:8)

最好使用AsyncTask(而不是线程 - 在Android活动中通常是一种很好的做法)。

创建一个AsyncTask类,并在该类上添加onPreExecute的进度对话框,并在onPostExecute中将其关闭。 您可以找到示例here

除此之外,您的代码中存在一些问题:

  1. 在onCreate(...)上调用ProgressDialog.show(...)通常会产生问题(因为在完成后,你将不会看到它,直到你的后台活动结束后才会这样)。
  2. 进度对话框上的所有操作都应该仅在UI线程上执行,因此您不能在某个随机线程上使用m_pd.dismiss()(这就是您应该使用AsyncTask的原因)。

答案 1 :(得分: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);
        }
    });