开发者

ProgressDialog doesn't appear

开发者 https://www.devze.com 2023-01-11 19:36 出处:网络
I have the following in my Activity that I use to download a users films in their LoveFilm queue, but the ProgressDialog never appears.

I have the following in my Activity that I use to download a users films in their LoveFilm queue, but the ProgressDialog never appears.

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开发者_Python百科(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();
        }

    }

I've seen others with this problem, and they all basically get around to recommending a line that looks like mine

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

The rest of the code works, the users films are downloaded via the thread, but the dialog never shows up, it takes a few seconds too, it's not like the dialog is being dismissed before it's had time to appear.


It's better if you use AsyncTask (instead of thread - it is generally good practice in Android activities).

Create an AsyncTask class, and on that class add a progress dialog at onPreExecute, and dismiss it at onPostExecute. You can find an example here.

Other than that, there are a few problems in your code:

  1. Calling ProgressDialog.show(...) at onCreate(...) is generally problematic (since you won't see it until onCreate will finish, which is usually way after your background activity has finished).
  2. All of the operations on your progress dialog should be executed only on the UI thread, so you can't use m_pd.dismiss() on some random thread (that's why you should use AsyncTask).


What if you call with this instead of MyListActivity.this?

It is possible, though unlikely since this is within onCreate(), that it is not being called from the UI thread.

Try surrounding the call with runOnUiThread():

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号