开发者

AsyncTask ProgressDialog won't update the dialog message

I'm having an issue with a long ProgressDialog in my app. I want to install a rather large database the first time the app is launched (converted into a text document, the database would be a little under 200 pages). Obviously, this will take some time, so I want to display a ProgressDialog to the user while this is going on.

I'm trying to accomplish this with an AsyncTask; I had previously tried with a Thread, but I got bogged down with issues related to saving/restoring the state.

The progress bar updates just fine. However, I'm installing the database in three stages, and I'd like to show those stages separately, both so the user has some understanding about what's going on, and so each percentage point on the bar doesn't take so long. And for some reason, while I'm able to set the progress on the dialog, setting the message (or the title) doesn't appear to do anything.

Here's the code for my AsyncTask subclass:

public class InstallDbTask extends AsyncTask<Void, Integer, Void>
{
    private static final String TAG = "InstallDbTask";
    private static final int READ_RULES = 0;
    private static final int WRITE_RULES = 1;
    private static final int RW_GLOSSARY = 2;

    private ProgressDialog dialog;
    private Context context;

    public InstallDbTask(Context context) { this.context = context; }

    protected void onPreExecute()
    {
        dialog = new ProgressDialog(context);
        dialog.setProgressStyle(STYLE_HORIZONTAL);
        dialog.setCancelable(false);
        dialog.show();
    }

    protected Void doInBackground(Void... params)
    {
        ... Initialization ...

        // Number of actions to perform for progress bar
        int totalCount = rules.length;
        // Literal increment for each action
        int incrementCount = 0;
        // Integral percentage: incrementCount / totalCount * 100
        int total = 0;

        // Read rules from XML
        for(int i = 0; i < rules.length; i++)
        {
            ... Parse XML ...

            incrementCount++;
            total = (int)(((float)incrementCount / totalCount) * 100);
            publishProgress(total, READ_RULES);
        }

        incrementCount = 0;

        // Write rules to DB
        SQLiteDatabase database = new DbOpenHelper(context).getWritableDatabase();
        for(Rule r : rulesList)
        {
            ... Insert ...

            incrementCount++;
            total = (int)(((float)increment开发者_StackOverflow中文版Count / totalCount) * 100);
            publishProgress(total, WRITE_RULES);
        }

        totalCount = glossaryTerms.length;
        incrementCount = 0;

        // Write glossary to DB
        String term = null;
        for(int i = 0; i < glossaryTerms.length; i++)
        {
            ... Insert ...

            incrementCount++;
            total = (int)(((float)incrementCount / totalCount) * 100);
            publishProgress(total, RW_GLOSSARY);
        }
        database.close();

        return null;
    }

    protected void onProgressUpdate(Integer... progress)
    {
        dialog.setProgress(progress[0]);
        switch (progress[1])
        {
            case READ_RULES:
                dialog.setMessage(context.getString(R.string.load_db1));
                break;
            case WRITE_RULES:
                dialog.setMessage(context.getString(R.string.load_db2));
                break;
            case RW_GLOSSARY:
                dialog.setMessage(context.getString(R.string.load_db3));
                break;
        }
    }

    protected void onPostExecute(Void result)
    {
        dialog.dismiss();
    }
}

The cases in the onProgressUpdate method are being reached correctly, the ProgressDialog just isn't getting the message, so to speak. Is there anything I'm doing wrong?


You have to set an initial message before you show the dialog. Otherwise calling dialog.setMessage() in onProgressUpdate() has no effect.

To fix your code you have to add dialog.setMessage("Some initial message") (the message string can be "", but it can't be null) before calling dialog.show():

protected void onPreExecute()
{
    dialog = new ProgressDialog(context);
    dialog.setProgressStyle(STYLE_HORIZONTAL);
    dialog.setCancelable(false);
    dialog.setMessage("Installing database, please wait");
    dialog.show();
}
0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜