0

我有一个 AsyncTask 接受 url 并获取所有通过的 url 的内容长度。我想在标题栏中更新进度条,并在完成获取最终值时显示警报框。但是我无法理解如何使这一切一起发挥作用。我现在拥有的代码会移动进度条,但不会显示警报框。我没有自定义标题栏,而是调用 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 。但是使用上面的这段代码,所有的 urls 内容长度都被添加到“total”中。而且我认为上面的代码是正确的。我的实现是:从主类中按下一个按钮。该按钮将所有 url 传递给 AsyncTask。当 url 获取长度并添加到总数(在后台)时,标题栏中会出现一个进度条,直到后台工作完成。然后一个警告对话框提示用户选择。

正在发生的事情是进度条到达末尾并且没有显示警报对话框。在我开始添加此进度条之前,出现了警报对话框。现在没有了。我怎样才能让进度条随着 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();    

    } 
4

1 回答 1

0

sat 是对的,但是您可以在 onPostExecute() 方法中执行此操作,该方法具有 UI 线程访问权限,始终记住只有 doInBackground() 没有 UI 线程访问权限,其余所有 3 个方法都具有。如果您需要的不仅仅是具体并显示您发现困难的代码。

于 2011-09-23T03:49:18.407 回答