【问题标题】:Change a dialog's message while using AsyncTask?使用 AsyncTask 时更改对话框的消息?
【发布时间】:2011-11-01 17:10:18
【问题描述】:

我查看了其他几个关于类似问题的问题,我发现我需要使用onProgressUpdate 方法来更改ProgressDialog 的消息。

例如,我有这样的代码在AsyncTaskdoInBackGround 中运行(这只是一个非常小的示例):

        byte[] data = getBytesFromFile(image);

        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        pictures.dia.setProgress(30);
        pictures.dia.setMessage("Data beginning upload sequence...");

        URL connectURL = new URL(this.base_url);
        HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", "multipart/form-data, boundary=" + boundary);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
        pictures.dia.setProgress(40);
        pictures.dia.setMessage("Output Stream prepared...");

当我最初运行时,我收到一个泄漏窗口错误,说我无法在AsyncTask 之外更改dia 的消息。

所以我的问题是,当dia的进度达到一定数量时,如何使用onProgressUpdate设置dia的消息? (即,当dia 的进度 = 30 时,让它说“数据开始上传序列...”)
onProgressUpdate 显然必须始终检查dia 的进度(我想就像一个听众)[如果它还没有这样做,我怎样才能让它这样做?]

【问题讨论】:

    标签: android android-asynctask message progressdialog


    【解决方案1】:

    你需要实现AsyncTaskonProgressUpdate方法。创建一个包含进度百分比的新类,并且消息仅作为 onProgressUpdate 方法的唯一参数。

    在 onProgressUpdate 中,调用dia.setProgressdia.setMessage

    在您的 doInBackground 方法中,使用包含新百分比和消息的新类的实例调用 publishProgress。这将导致AsyncTask 在主线程上调用onProgressUpdate

    例如:

    private static class TaskProgress {
        final int percentage;
        final String message;
    
        TaskProgress(int percentage, String message) {
            this.percentage = percentage;
            this.message = message;
        }
    }
    

    在您的 AsyncTask 中(将 ?s 替换为您的实现的正确类型):

    public ProgressAsyncTask extends AsyncTask<?, TaskProgress, ?> {
    
        public void onProgressUpdate(TaskProgress progress) {
             pictures.dia.setProgress(progress.percentage);
             pictures.dia.setMessage(progress.message);
        }
    
        public ? doInBackground(?... params) {
            // ... your code       
            publishProgress(new TaskProgress(30, "A new update"));
            // ... your code 
        }
    
    }
    

    【讨论】:

    • 好的,我知道它是如何工作的。我现在有一个问题:当我将publishProgress(new TaskProgress(10, "Beginning sequence...")); 放入一些runnable 代码时出现错误。我的 runnable 在 doInBackground 方法中被调用,但实际上不在该方法中。此外,runnable 稍后调用另一个类的另一个方法,我不能使用publishProgress。有什么办法吗?
    • 注意:如果我尝试Task.publishProgress(new TaskProgress(10, "My message here..."));,它表示从 AsyncTask 中看不到 publishProgress。不确定这是否有帮助。
    • 您必须在 doInBackground 方法中调用 publishProgress。
    • 那不是问题。我所有的 doInBackground 方法都是 uploader.run(),我在其中运行我的 Runnable 代码,该代码 doInBackground 方法之外。你看到这里的问题了吗? doInBackground 调用runnable 仅此而已,我不想将runnable 放入doInBackground
    【解决方案2】:

    您是对的,您应该将用于更新视图的代码放在dia 中的onProgressUpdate 方法中。但是,要确保调用 onProgressUpdate,您需要调用 publishProgress。基本上,您从后台线程调用 publishProgress,然后系统会在未来某个未定义的时间在 UI 线程上调用 onProgressUpdate。

    【讨论】:

    • 所以我应该使用publishProgress(some number)而不是pictures.dia.setProgress(some number)?好的,不过,onProgressUpdate 如何显示我想要的正确消息?
    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多