AlertDialog setmessage在Asynctask中不起作用

时间:2016-05-04 05:49:32

标签: android android-asynctask alertdialog async-onprogressupdate

下面是我的代码我试图通过onProgressUpdate方法在Asyntask中显示我的进度,但它不会显示在警报diaalog中。仅显示初始消息。

 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似乎没有将消息设置为我的警报对话框。

2 个答案:

答案 0 :(得分:5)

根据您的代码,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,然后使用setMessage实例将AlertDialog传递给x = data.frame(x=letters[1:5],y=1:5) y = split(x,seq(1:nrow(x))) names(y) = x$x y$a

AlertDialogAlertDialog.Builder的文档。

希望这会有所帮助。祝好运。 :)

答案 1 :(得分:0)

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

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

您必须从private AlertDialog.Builder alert;

创建警告对话框