无法使publishProgress正常工作。救命?

时间:2011-09-23 03:01:17

标签: java android progress-bar android-asynctask android-titlebar

我有一个AsyncTask,它接受网址并获取所有传递的网址的内容长度。我想在标题栏中更新进度条,并在获取最终值时显示警告框。但我无法理解如何将所有功能结合在一起。我现在的代码移动了进度条,但没有显示警告框。我没有自定义标题栏,而是调用requestWindowFeature(FEATURE_PROGRESS)。任何帮助将不胜感激。

这是我的异步类

    private class MyClass extends AsyncTask<URL, Integer, Float>
    {
         protected Float doInBackground(URL... urls)
         {
              try
              {
                for(int i = 0; i<urls.length; i++)
                {
                    url = urls[i];
                    urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.setDoOutput(true);
                    urlConnection.connect();
                    size = urlConnection.getContentLength();
                    total += size; 
                    while(progress<total)
                    {
                        progress++;
                        publishProgress(progress);
                    }

                }
            }
            catch(MalformedURLException e)
            {
                e.printStackTrace();
            }
            catch(IOException iox)
            {
                iox.printStackTrace();
            }
            finally
            {
                urlConnection.disconnect();
            }
               return total;
    }

       protected void onProgressUpdate(Integer... values)
       {
        setProgressBarVisibility(true);
        setProgress(values[0]);     
   }

编辑:我知道publishProgress将数据从doInBackground方法传递给onProgressUpdate。但是使用上面的代码,所有网址内容长度都被添加到“总计”。我认为上面的代码是正确的。我的实现是:从主类中按下一个按钮。该按钮将所有URL传递给AsyncTask。当网址获得长度并添加到总数(在后台)时,标题栏中会出现一个进度条,直到后台工作完成。然后,警告对话框会提示用户进行选择。

虽然进度条到达结尾并且警报对话框没有显示,但发生了什么。在我开始添加此进度条之前,出现了警告对话框。现在它没有。如何使用url内容长度使进度条正确递增....关闭进度条.....然后在onPostExecute中加载警告对话框?

    protected void onPostExecute(final Float result)
    {       

        setProgressBarVisibility(false);

        AlertDialog.Builder alertbox = new AlertDialog.Builder(Vacation.this);
        alertbox.setMessage(TEXT STUFF);
        alertbox.setPositiveButton("Yes", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface arg0, int arg1) 
            {

            }
        });
        alertbox.setNegativeButton("No", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface arg0, int arg1)
            {

            }
        });
        alertbox.show();    

    } 

1 个答案:

答案 0 :(得分:0)

sat是对的,但是你可以在onPostExecute()方法中做到这一点,它具有UI线程访问权限,总是记得只有doInBackground()没有UI线程访问所有3方法都有。如果您需要的不仅仅是具体的,并在您发现困难的地方显示代码。