2011-09-16 14 views
0

私は問題があります。私のアプリがフィードからニュースをダウンロードしている間、進捗ダイアログを作りたい。 これは、現時点では私のコードです:Android - Progress Dialog

public class NyhedActivity extends Activity { 
    String streamTitle = ""; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nyheder); 

     TextView result = (TextView)findViewById(R.id.result); 

      try { 
     URL rssUrl = new URL("http://rss.tv2sport.dk/rss/*/*/*/248/*/*"); 
     SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance(); 
     SAXParser mySAXParser = mySAXParserFactory.newSAXParser(); 
     XMLReader myXMLReader = mySAXParser.getXMLReader(); 
     RSSHandler myRSSHandler = new RSSHandler(); 
     myXMLReader.setContentHandler(myRSSHandler); 
     InputSource myInputSource = new InputSource(rssUrl.openStream()); 
     myXMLReader.parse(myInputSource); 

     result.setText(streamTitle); 

     } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     result.setText("Cannot connect RSS!"); 
     } catch (ParserConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     result.setText("Cannot connect RSS!"); 
     } catch (SAXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     result.setText("Cannot connect RSS!"); 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     result.setText("Cannot connect RSS!"); 
     } 


     } 

     private class RSSHandler extends DefaultHandler 
     { 
     final int stateUnknown = 0; 
     final int stateTitle = 1; 
     int state = stateUnknown; 

     int numberOfTitle = 0; 
     String strTitle = ""; 
     String strElement = ""; 

     @Override 
     public void startDocument() throws SAXException { 
     // TODO Auto-generated method stub 
     strTitle = "Nyheder fra "; 
     } 

     @Override 
     public void endDocument() throws SAXException { 
     // TODO Auto-generated method stub 
     strTitle += ""; 
     streamTitle = "" + strTitle; 
     } 

     @Override 
     public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException { 
     // TODO Auto-generated method stub 
     if (localName.equalsIgnoreCase("title")) 
     { 
     state = stateTitle; 
     strElement = ""; 
     numberOfTitle++; 
     } 
     else 
     { 
     state = stateUnknown; 
     } 
     } 

     @Override 
     public void endElement(String uri, String localName, String qName) 
     throws SAXException { 
     // TODO Auto-generated method stub 
     if (localName.equalsIgnoreCase("title")) 
     { 
     strTitle += strElement + "\n"+"\n"; 
     } 
     state = stateUnknown; 
     } 

     @Override 
     public void characters(char[] ch, int start, int length) 
     throws SAXException { 
     // TODO Auto-generated method stub 
     String strCharacters = new String(ch, start, length); 
     if (state == stateTitle) 
     { 
     strElement += strCharacters; 
     } 
     } 
    } 

} 

私は進捗ダイアログを使用する方法を見つけ出すことはできません。誰でも私のどこにプログレス・ダイアグラムを定義するかを示すことができますか? 私はたくさんの場所を見てきましたが、誰もが違ったやり方をしているようです。(

私は睡眠不足しかし、私は私が間違ってやっているかを把握することはできません。

答えて

1

私の好ましい方法:

class MyActivity extends Activity{ 

final static int PROGRESS_DIALOG = 1; 

ProgressDialog dialog; 

@Override 
protected Dialog onCreateDialog(int id){ 
    switch(id){ 
    case PROGRESS_DIALOG: 
     dialog = new ProgressDialog(this); 
     dialog.setMessage("Whatever you want to tell them."); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(true); // if you want people to be able to cancel the download 
     dialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ 
     @Override 
     public void onCancel(DialogInterface dialog) 
     { 
      **** cleanup. Not needed if not cancelable **** 
     }}); 
     return dialog; 
    default: 
     return null; 
    } 
} 

あなたはそれを表示したい場合は、あなたがshowDialog(PROGRESS_DIALOG)を行うことができますし、それが離れて行きたいときにdialog.dismiss()を行うことができます。

+0

私はそのように試みました。 ProgressDialogをどこで起動してコードを動作させるかわかりません。 私はそれを開始するとき、私はそれを却下することはできません。 私はおそらく間違った範囲に物事を配置すると思う:/ – Kano

+0

メソッドの参照を作成する代わりに、クラスにグローバルにする必要があります。私はそれを更新します。進捗を開始するには、開始するときに 'showDialog(PROGRESS_DIALOG)'を呼び出します。そして、それを削除するために 'dialog.dismiss()'を呼び出します。私はいくつかの編集を行います。 – DeeV

+0

私は数回始めることにしましたが、グローバルクラスで進捗ダイアログを作成しても、それを使用することはできません。 しかし、私はJavaにとって非常に新しく、すべてのルールを完全に理解していません。 解決策を楽しみにしていて、試してみると約3時間かかってきました:) – Kano

1

にUIスレッドでのネットワークIOのような任意の実行時間の長いものをしないでください(つまり、あなたのonCreate()を呼んだ)、Androidはあなたを閉じて強制されますアプリケーションの代わりにAsyncTaskを使用して、リンクされたjavadocで例を確認してください。

  • 作成して表示するあなたのonPreExecute()の進行状況ダイアログで、そのフィールドへの参照を保持してください。
  • doInBackground()からpublishProgress()を呼び出し、onProgressUpdate()で処理してください。
  • 上にリンクされている例のように、例えば、あなたのAsyncTaskコンストラクタにContextを渡し、onPreExecute()でダイアログを作成するには、あなたの進行状況ダイアログを閉じて、あなたのUI(テキストフィールドなど)を更新onPostExecute()

であなたの活動thisをフィールドに保管してください。

オリエンテーションの変更があってもデータが失われないようにするには、AsyncTaskに解析されたデータを書き込んでSQLite databaseに書き込んでから、アクティビティにデータベースの内容のみを表示します。実際の「進行状況ダイアログを表示」の部分については


、その静的ファクトリメソッドの1 show(...)を使用します。

ProgressDialog dialog = ProgressDialog.show(
    this, // a context, e.g. your activity 
    "Downloading...", // title 
    "Downloading RSS feed.", // message 
); 

これは、作成して、1つのステップでのダイアログが表示されます。

+0

こちらも^^^^^^。あなたは 'onPreExecute()'で 'showDialog(PROGRESS_DIALOG)'を行い、 'onPostExecute()'でそれを却下することができます。 – DeeV

+0

はい、DeeVのような管理ダイアログを使用するとうまくいくはずです。両方のアプローチを試してください:) –

+0

ありがとうございます。私はそれについて何かを読んだが、それを行うための "より"軽い方法があると思った。上記のコードが動作していたので、私はそれをそうすることは大丈夫だと思った。しかし、代わりに非同期タスクで作業をしようとします。 SugestionのためのThanx :) – Kano