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】:根据您的代码,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
实例传递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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章