Android 吐司消息未在正确的时间显示?

Android 吐司消息未在正确的时间显示?,android,android-toast,Android,Android Toast,我需要通过Toast显示“稍等片刻…”消息,同时应用程序尝试从internet获取一些数据,这可能需要几秒钟的时间,具体取决于internet连接和服务器上的负载。 http连接是通过异步任务进行的 我所做的是通过“Toast.makeText”方法显示消息,然后输入一个“while”循环,该循环在AsyncTask的execute方法完成时中断,然后显示活动的一些结果 问题是土司直到while循环中断才出现! 我试图用setText在TextView中显示消息来代替Toast,但同样的情况发生

我需要通过Toast显示“稍等片刻…”消息,同时应用程序尝试从internet获取一些数据,这可能需要几秒钟的时间,具体取决于internet连接和服务器上的负载。 http连接是通过异步任务进行的

我所做的是通过“Toast.makeText”方法显示消息,然后输入一个“while”循环,该循环在AsyncTask的execute方法完成时中断,然后显示活动的一些结果

问题是土司直到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();
                }
            }
私有类下载文件任务扩展异步任务{
受保护的长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上工作。我不知道这一点。