Toast 消息没有在正确的时间显示?
Toast message is not displayed at the right time?
我需要通过 Toast 显示 "Wait a moment..." 消息,而该应用程序会尝试从 Internet 获取一些数据,这可能需要几秒钟,具体取决于 Internet 连接和服务器上的负载。
http 连接是通过 AsyncTask 建立的。
我正在做的是通过 "Toast.makeText" 方法显示消息,然后我进入一个 "while" 循环,该循环在 AsyncTask 的执行方法完成时中断,然后我显示一些结果在 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();
}
}
不要这样做。您正在使用 while 循环阻塞 ui 线程。这就是为什么您的 Toast 没有出现的原因。
删除您的 while 并覆盖 AsyncTask 中的 onPostExecute()。此方法在 Ui 线程上运行,与 doInbackground 不同,因此您可以更新 Activity UI.
在异步任务中使用此方法:
@Override
protected void onPreExecute() {
super.onPreExecute();
// Show Toast
Toast.makeText(context,"text",Toast.LENGTH_LONG).show();
}
并记住 "onPostExecute" 和 "onPreExecute" 可以更改 UI ,不要更改 UI 在 "doInBackground" .
我需要通过 Toast 显示 "Wait a moment..." 消息,而该应用程序会尝试从 Internet 获取一些数据,这可能需要几秒钟,具体取决于 Internet 连接和服务器上的负载。 http 连接是通过 AsyncTask 建立的。
我正在做的是通过 "Toast.makeText" 方法显示消息,然后我进入一个 "while" 循环,该循环在 AsyncTask 的执行方法完成时中断,然后我显示一些结果在 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();
}
}
不要这样做。您正在使用 while 循环阻塞 ui 线程。这就是为什么您的 Toast 没有出现的原因。
删除您的 while 并覆盖 AsyncTask 中的 onPostExecute()。此方法在 Ui 线程上运行,与 doInbackground 不同,因此您可以更新 Activity UI.
在异步任务中使用此方法:
@Override
protected void onPreExecute() {
super.onPreExecute();
// Show Toast
Toast.makeText(context,"text",Toast.LENGTH_LONG).show();
}
并记住 "onPostExecute" 和 "onPreExecute" 可以更改 UI ,不要更改 UI 在 "doInBackground" .