Android 吐司消息未在正确的时间显示?
我需要通过Toast显示“稍等片刻…”消息,同时应用程序尝试从internet获取一些数据,这可能需要几秒钟的时间,具体取决于internet连接和服务器上的负载。 http连接是通过异步任务进行的 我所做的是通过“Toast.makeText”方法显示消息,然后输入一个“while”循环,该循环在AsyncTask的execute方法完成时中断,然后显示活动的一些结果 问题是土司直到while循环中断才出现! 我试图用setText在TextView中显示消息来代替Toast,但同样的情况发生了,while循环中断后显示的消息! 有什么想法吗?我的代码如下所示:Android 吐司消息未在正确的时间显示?,android,android-toast,Android,Android Toast,我需要通过Toast显示“稍等片刻…”消息,同时应用程序尝试从internet获取一些数据,这可能需要几秒钟的时间,具体取决于internet连接和服务器上的负载。 http连接是通过异步任务进行的 我所做的是通过“Toast.makeText”方法显示消息,然后输入一个“while”循环,该循环在AsyncTask的execute方法完成时中断,然后显示活动的一些结果 问题是土司直到while循环中断才出现! 我试图用setText在TextView中显示消息来代替Toast,但同样的情况发生
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();
}
}
私有类下载文件任务扩展异步任务{
受保护的长doInBackground(URL…URL){
InputStream in=null;
HttpURLConnection-urlConnection=null;
试一试{
urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setConnectTimeout(4000);
in=urlConnection.getInputStream();
in=new BufferedInputStream(urlConnection.getInputStream());
url_input=readStream(in);
........
捕获(例外e){
e、 printStackTrace();
}
最后{
dataRetrieved=true;
urlConnection.disconnect();
if(in!=null){
试一试{
in.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
不要这样做。你正在用while循环阻塞ui线程。这就是为什么你的Toast没有显示出来
在AsyncTask中删除while并重写onPostExecute()。此方法在Ui线程上运行,与doInbackground不同,因此您可以更新活动Ui。在asynktask中使用此方法:
@Override
protected void onPreExecute() {
super.onPreExecute();
// Show Toast
Toast.makeText(context,"text",Toast.LENGTH_LONG).show();
}
记住“onPostExecute”和“onPreExecute”可以更改UI,不要在“doInBackground”中更改UImethod。您必须在ui线程中完成操作。等待asyntask在ui线程中结束是一种不好的做法。这样做您不会从asyntask中获得任何好处好的,非常感谢,我明白了。onPostExecute和onPreExecute在ui上工作。我不知道这一点。