Toast消息没有在合适的时间显示?

时间:2015-04-08 09:09:27

标签: android android-toast

我需要通过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();
                }
            }

2 个答案:

答案 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;