0

URL を受け取り、渡されるすべての URL のコンテンツの長さを取得する 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 コンテンツの長さが「合計」に追加されています。そして、上記のコードは正しいと思います。これの私の実装は次のとおりです。メインクラスからボタンを押します。そのボタンは、すべての 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 は正しいですが、UI スレッド アクセスを持っている onPostExecute() メソッドでそれを行うことができます。doInBackground() だけが UI スレッド アクセスを持っていないことを常に覚えておいてください。残りの 3 つのメソッドはすべて持っています。具体的に説明する以上のことが必要な場合は、問題を見つけているコードを示してください。

于 2011-09-23T03:49:18.407 に答える