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" .