AlertDialog setmessage 在 Asynctask 中无法工作

3
以下是我的代码,我试图通过onProgressUpdate方法显示Asyntask中的进度,但它没有显示在警示对话框中。只有初始消息被显示。
 class DownloadFileFromURL extends AsyncTask<String, String, String> {

        private AlertDialog.Builder alert;
        private int progress = 0;
        /**
         * Before starting background thread Show Progress Bar Dialog
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            alert = new AlertDialog.Builder(context);
            alert.setTitle("Downloading..");
            alert.setMessage("1");
            alert.setCancelable(false);
            alert.show();
        }

        /**
         * Downloading file in background thread
         */
        @Override
        protected String doInBackground(String... f_url) {
            int count;
            try {
                URL url = new URL(f_url[0]);
                URLConnection conection = url.openConnection();
                conection.connect();

                // this will be useful so that you can show a tipical 0-100%
                // progress bar
                int lenghtOfFile = conection.getContentLength();

                // download the file
                InputStream input = new BufferedInputStream(url.openStream(),
                        8192);

                // Output stream
                OutputStream output = new FileOutputStream(file);

                byte data[] = new byte[1024];

                long total = 0;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    // After this onProgressUpdate will be called
                    publishProgress("" + (int) ((total * 100) / lenghtOfFile));

                    // writing data to file
                    output.write(data, 0, count);
                }

                // flushing output
                output.flush();

                // closing streams
                output.close();
                input.close();

            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }

            return null;
        }

        /**
         * Updating progress bar
         */
        @Override
        protected void onProgressUpdate(String... progress) {
            Log.d("Myapp","progress :"+progress[0]);
            alert.setMessage(""+progress[0]);
        }

        /**
         * After completing background task Dismiss the progress dialog
         **/
        @Override
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after the file was downloaded
}
}

我在onProgressUpdate中也写了一条日志来显示进度更新,该日志已打印,但是onProgressUpdate中的alert.setMessage似乎没有将消息设置到我的警报对话框中。


我认为如果你使用ProgressDialog而不是AlertDialog会更好。 - Huy
你应该在builder中使用setmessage而不是alertdialog。另外,将中间参数类型从String替换为Integer怎么样? - iroiroys
@iroiroys 是的,我之前做错了,因为我以为那样会起作用,然后我把中间参数类型改成了整数。谢谢..!! - user6250920
2个回答

5
根据您的代码,alert 是一个 AlertDialog.Builder 而不是 AlertDialog 本身。这让我有些担心,因为它可能无法更改的原因是您已经显示了构建器,但没有给出 AlertDialog。因此,我尝试了一个简单的代码:
public class MainActivity extends AppCompatActivity {

    private AlertDialog.Builder alert;
    private AlertDialog ad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        alert = new AlertDialog.Builder(this);
        alert.setTitle("Downloading..");
        alert.setMessage("1");
        alert.setCancelable(false);
        ad = alert.show();


        Log.d("SAMPLE", "SET MESSAGE 2");
        alert.setMessage("2");

        Log.d("SAMPLE", "SET MESSAGE 3");
        ad.setMessage("3");
    }

}

起初,我只是使用了 alert.setMessage(这是 AlertDialog.Builder),但消息根本没有改变。但是将其放在一个 AlertDialog 中,然后设置 AlertDialog 实例的消息,该消息就会发生变化。建议尝试此方法。首先将 AlertDialog.Builder 传递给一个 AlertDialog,然后使用 AlertDialog 实例来设置消息内容。
有关 AlertDialogAlertDialog.Builder 的文档。

你可以简单地使用:ad = new AlertDialog.Builder(this).create(); - Asama
@Asama 是的。但是我这样做是为了清晰明了。 - AL.
1
你可以像这样使用它:AlertDialog ad = new AlertDialog.Builder(this).create(); 然后将文本和标题添加到ad中并显示。因此,无需首先将标题和文本添加到构建器中,然后将该构建器属性显示在对话框中。这种方式更简单和清晰,因为它只使用了AlertDialog,而不是创建一个单独的builder ;)。 - Asama
theOldTown 没问题。请注意 @Asama 的评论。这将有助于减少代码行数。 :) - AL.
我将整个代码保持不变,并在onPre的最后一行更改为ad = alert.show(); 然后更改ad.setmessage。谢谢。 - user6250920
需要注意的是,除非您首先使用AlertDialog.Builderalert.setMessage()方法并输入""null输入也不起作用),否则ad.setMessage()方法将无法正常工作。这是一个已知的问题,请参见https://issuetracker.google.com/issues/36913966。 - Eido95

0
在你的代码中,你忘记了构建警告对话框。请参考以下内容。
AlertDialog alertDialog = alert.create();
    alertDialog.show();

你需要从 private AlertDialog.Builder alert; 创建一个警告对话框。


应该是alert.create(),因为你将builder定义为alert而不是alertdialogbuilder :) - Asama
@Asama 上面的代码是一个示例代码,下面的是问题中的声明,它们都是不同的代码片段。 - UserSharma
@Asama现在我根据问题的代码进行了编辑。 - UserSharma
如果你使用了alertdialogbuilder.create(),那么对于那些刚接触Android和Java的人来说可能会造成困惑。因此,如果你说他必须从“alert”构建器创建对话框,那么最好使用它来演示你提供的代码的正确实现;)。希望你明白。 - Asama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接