2011-09-16 115 views
0

我有问题。我想在应用程序从Feed中下载一些新闻时进行进度对话。 这是我的代码的时刻:Android - 进度对话框

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

我得到它开始几次,但是然后它不能使用dismiss,即使我在全球课上进度对话框。 但是我对Java很陌生,并没有完全理解所有的规则。 期待SE解决方案,屁股我用了近3小时用来尝试和错误:) – Kano

1

不要做任何运行在UI线程的东西像网络IO(也就是调用您onCreate()),Android将强制关闭应用。使用AsyncTask来代替,查看链接的javadoc为例。

  • 创建并显示哟乌尔进展onPreExecute()对话框,并保持对它的引用在外地
  • 更新进度通过调用您的doInBackground()publishProgress()和处理,在onProgressUpdate(),例如像上面
  • 链接的例子闭上你的进度对话框,并更新你的UI(文本字段等)onPostExecute()

onPreExecute()创建对话框,通过一个ContextAsyncTask构造,例如您的活动this并将其存储在一个字段中。

如果您希望自己的数据在方向更改中生存或在整个活动重新启动后保持不变,请让您的AsyncTask将解析的数据写入SQLite database,然后仅显示活动中的数据库内容。


至于实际的“显示进度对话框”的一部分,利用其静态工厂方法show(...)之一:

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

这将创建为一步显示一个对话框。

+0

此外^^^^^^。你可以在'onPreExecute()'中执行'showDialog(PROGRESS_DIALOG)',并在'onPostExecute()'上关闭它。 – DeeV

+0

是的,使用像DeeV这样的托管对话框会起作用。试试这两种方法:) –

+0

谢谢。我读了一些关于它的内容,但我认为有一种“更多”的方式来做到这一点。由于上述代码正在工作,我认为可以这样做。但我会尝试在Async任务中完成任务。 Thanx的消化:) – Kano