AlertDialog setmessage 在 Asynctask 中不起作用

Posted

技术标签:

【中文标题】AlertDialog setmessage 在 Asynctask 中不起作用【英文标题】:AlertDialog setmessage not working inside Asynctask 【发布时间】:2016-08-29 09:40:39 【问题描述】:

下面是我的代码,我试图通过 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。 您不是在 alertdialog 而是在 builder 上使用 setmessage。以及如何用整数替换中间参数类型字符串? @iroiroys 是的,我做错了,因为我认为它会那样工作,是的,我将中间参数类型更改为整数谢谢..!! 【参考方案1】:

根据您的代码,alertAlertDialog.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 实例传递setMessage

AlertDialog 和 AlertDialog.Builder 的文档。

【讨论】:

你可以简单地使用:ad = new AlertDialog.Builder(this).create(); @Asama 是的。但为了清楚起见,我这样做了。 你可以这样使用:AlertDialog ad = new AlertDialog.Builder(this).create();而不是在广告中添加文字和标题并显示出来。因此,无需先向构建器添加标题和文本,然后将构建器属性显示到对话框中。这种方式更加简单明了,因为它只使用 AlertDialog 并且不创建单独的构建器;)。 theOldTown 没问题。请注意@Asama 的评论。这将有助于减少 LOC。 :) 我保留了整个代码,并更改了 onPre ad = alert.show(); 中的最后一行然后更改 ad.setmessage 谢谢..【参考方案2】:

在您的代码中,您忘记构建警报对话框。看到这个

AlertDialog alertDialog = alert.create();
    alertDialog.show();

你必须从private AlertDialog.Builder alert;创建一个警报对话框

【讨论】:

它应该是 alert.create() 因为您将 builder 定义为 alert 而不是 alertdialogbuilder :) @Asama 上面的代码是一个示例代码,下面的代码是来自问题的声明,它们都是不同的代码 sn-ps @Asama 现在我根据问题的代码编辑答案 如果您使用了 alertdialogbuilder.create() ,那么它可能会让那些刚接触 android 和 Java 的人感到困惑。因此,如果您说他必须从“警报”构建器创建对话框,那么最好使用它来演示您提供的代码的正确实现;)。希望你能得到它

以上是关于AlertDialog setmessage 在 Asynctask 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

控件AlertDialog

Android学习——AlertDialog

AlertDialog的解析

demo15 AlertDialog

Android AlertDialog

Android AlertDialog 各种弹框代码