【问题标题】:AlertDialog setmessage not working inside AsynctaskAlertDialog setmessage 在 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 是的,我做错了,因为我认为它会那样工作,是的,我将中间参数类型更改为整数谢谢..!!

标签: android android-asynctask android-alertdialog async-onprogressupdate


【解决方案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

AlertDialogAlertDialog.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 的人感到困惑。因此,如果您说他必须从“警报”构建器创建对话框,那么最好使用它来演示您提供的代码的正确实现;)。希望你能得到它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多