2011-08-16 13 views
1

"ProgressThings"に時間があります。私は、ビューの内容を動的に変更するアプリケーションを持っています(ビュー自体も変更、消滅、再追加などがあります)。主な活動の特定の「スタイル」を担当するクラスがいくつかあります。そのうちの1人がXMLファイルをダウンロードして解析し(これを処理する特定のクラスがあります)、ダウンロードした内容に基づいてユーザーにいくつかのコンテンツを表示します。Android - 非ブロッキング回転ProgressDialog

とにかく、私の問題はProgressDialogを非ブロックにして、ユーザーが待っている間に他のアプリの機能とやり取りできるようにしたいということです。私はこの問題に関連するいくつかの答え(例えばthis oneのようなもの)を読んだが、これまで成功していない。 "setIndeterminate(true)"(紡績スタイルが必要)のProgressBarに変更することは機能していません(単に表示されません)。

プライベートクラスは私がProgressDialogを表示するために使用するクラスです。それは私が掲示した方法で働いていますが、それはUIインタラクション= /をブロックしています。

private class DownloadXmlTask extends AsyncTask<String, Void, Boolean> { 
    private ProgressDialog mProgress; 

    private int xmlType = 0; 
    XmlHandler xmlHandler = null; 

    DownloadXmlTask(){ 
     xmlHandler = new XmlHandler(); 
    } 

    @Override 
    protected void onPreExecute(){ 

     mProgress = new ProgressDialog(context); 
     mProgress.getWindow().setGravity(Gravity.CENTER); 
     mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     mProgress.setIndeterminate(true); 
     mProgress.setMessage("Carregando..."); 
     mProgress.show(); 
    } 

    @Override 
    protected Boolean doInBackground(String... urls) { 

     int count = urls.length; 
     for(int i=0; i<count; i++){ 
      parseXml(urls[i]); 
     } 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     if(result == true){ 
      mProgress.dismiss(); 
      // Do something else 

     } 
    } 

    /** 
    * Parses the xml defined by the parameter's String 
    * @param urlString The url's String 
    */ 
    private void parseXml(String urlString){ 
     try { 
      // Loads the url 
      URL url = new URL(urlString); 

      // Initializes the parser 
      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      SAXParser sp = spf.newSAXParser(); 

      // Sets the handler 
      XMLReader xr = sp.getXMLReader(); 
      xr.setContentHandler(xmlHandler); 

      // Parses 
      xr.parse(new InputSource(url.openStream())); 

     }catch(Exception e) { 
      // To something here 
     } 
    } 
} 

PS:それは必要ではないため、私はXmlHandlerクラスのコードを入れていない; P

PS2:任意の助けを事前に感謝:D

+0

しかし、ProgressDialogの代わりに必ずProgressBarが必要です。 – ernazm

+0

ええと...そして、ProgressDialogの代わりに 'ProgressBar'を使用しようとしましたが、進歩は単に出現していないと言いました。私は 'ProgressBar'でいくつかの可能性を試しました...私は本当に何か間違っていなければなりません。 私は次のようなものを試しました: 'mProgress = new ProgressBar(context); mProgress.setIndeterminate(true); mProgress.setVisibility(View.VISIBLE); '、そしてジョブが終了すると' mProgress.setVisibility(View.GONE); 'が使用されましたが、表示されません。そしてそれは単なる進歩であるため、私はAsyncTaskの 'publishProgress'のようなものは必要ないと思っています。 – Alesqui

答えて

1

代わりにProgressBarが必要です。それがあなたのために働かない理由はProgressBarViewであり、もう1つのViewのようにそれは表示するためにいくつかの親に追加する必要があります。いくつかtutorialを参照し、xmlレイアウトに注意してください。

+0

ありがとうErnazm!出来た!私はレイアウトで起こったすべての動的な変更をここで誤解し、「ビューを追加する」部分をスキップしました。 ProgressDialogをレイアウトに追加する必要がないという事実は私をこのミスに陥らせました。私を助けてくれた時間をもう一度ありがとう – Alesqui

0

あなたが現在表示されていますProgressDialogonPreExecute()にすると、UIスレッドはダイアログによってブロックされます。上記のernazmのようなProgressBarを使用して、AsyncTaskのバックグラウンドジョブの進捗状況をonProgressUpdate()を使用して通知することをお勧めします。アプリケーションのタイトルバーにProgressBarを置くことができます。thread SO

+0

残念ながら、あなたが指摘したスレッドの答えは、私のアプリがデフォルトの太さを持っていてはならないので、私にとってはうまくいきません。(そして私は 'Window.FEATURE_NO_TITLE'を使用しています。情報ありがとうございます – Alesqui

+0

@Alesquiあなたのレイアウトビューに固定された 'ProgressBar'を追加するのはどうでしょうか?例えば、レイアウトの上に' View.Gone'を使ってください。それを使いたいときは、可視性を 'View.Visible'に設定し、' OnAppgressUpdate() 'を使って' AsyncTask'の進捗状況を 'ProgressBar'に投稿してください。 –

+0

これはうまくいくようです。私はちょうどそれが私のためによりよく働くので、エルナズムの答えをマークします(私は既に試してみたので、今すぐすでに働いています:D) – Alesqui

関連する問題