我需要通过Toast显示“等待片刻......”消息,同时应用程序尝试从互联网上获取一些数据,这可能需要几秒钟,具体取决于互联网连接和服务器上的负载。 http连接是通过AsyncTask进行的。
我正在做的是我通过以下方式显示消息:“Toast.makeText”方法,然后我输入一个“while”循环,当AsyncTask的execute方法完成时,它会中断,然后我在Activity上显示一些结果。
问题是Toast在while循环中断之前不会出现! 我尝试使用setText在TextView中显示消息来替换Toast,但同样的情况发生了,while循环后显示的消息中断了! 有什么想法吗?我的代码看起来像这样:
waitToast = Toast.makeText(this,R.string.WaitText, Toast.LENGTH_SHORT);
waitToast.show();
.........
.........
new DownloadFilesTask().execute();
dataRetrieved = false;
while (!dataRetrieved){ }
........
在doInBackground中:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
InputStream in = null;
HttpURLConnection urlConnection = null;
try {
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setConnectTimeout(4000);
in = urlConnection.getInputStream();
in = new BufferedInputStream(urlConnection.getInputStream());
url_input = readStream(in);
........
catch (Exception e) {
e.printStackTrace();
}
finally{
dataRetrieved = true;
urlConnection.disconnect();
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
不要这样做。你用while循环阻止ui线程。这就是你的Toast没有出现的原因。
删除你的while并覆盖AsyncTask中的onPostExecute()。与doInbackground不同,此方法在Ui线程上运行,因此您可以更新Activity UI。
答案 1 :(得分:0)
在asynktask中使用此方法:
@Override
protected void onPreExecute() {
super.onPreExecute();
// Show Toast
Toast.makeText(context,"text",Toast.LENGTH_LONG).show();
}
记住&#34; onPostExecute&#34;和&#34; onPreExecute&#34;可以更改用户界面,不要在&#34; doInBackground&#34;