【问题标题】:How to get RSS feed to work in a fragment in android?如何让 RSS 提要在 android 的片段中工作?
【发布时间】:2015-07-16 00:33:47
【问题描述】:

我正在尝试在片段中显示 RSS 提要。当您点击一个按钮时,提要应该被拉出并显示在 2 个 TextView 中(例如 = 'tv1' 是 'City' 而 'tv2' 是 'Arsenal')。

我使用的代码在没有碎片的情况下运行良好。

但是当我为片段定制它时,当您单击按钮时,应用程序会停止并冻结。运行应用程序时没有显示错误,但我认为从片段内部解析 XML 存在一些问题。

下面是 EPLFragment 类:

public class EPLFragment extends Fragment {

   String finalUrl="http://www.michael-r-oneill.ie/Custom_Mike/rsseplfixtures.xml";
   HandleXML obj;
   TextView firsttag;
   TextView secondtag;
   ImageButton mykzimagebutton, mykzimagebutton2;   

 public View onCreateView(LayoutInflater paramLayoutInflater, ViewGroup paramViewGroup, Bundle paramBundle)
 {

View rootView = paramLayoutInflater.inflate(R.layout.epl_layout, paramViewGroup, false);

        this.firsttag = ((TextView)rootView.findViewById(R.id.tv1));
        this.secondtag = ((TextView)rootView.findViewById(R.id.tv2));         
        this.mykzimagebutton = ((ImageButton)rootView.findViewById(R.id.imagebuttonhome));

        this.mykzimagebutton.setOnClickListener(new View.OnClickListener()
        {
        public void onClick(View v)
        {   
            String finalUrl="http://www.michael-r-oneill.ie/Custom_Mike/rsseplfixtures.xml";
            HandleXML obj;

            obj = new HandleXML(finalUrl);
            obj.fetchXML();
            while(obj.parsingComplete);

            firsttag.setText(obj.getFirstTag());
            secondtag.setText(obj.getSecondTag()); 
           }
        });

    return rootView;    
 }

}

下面是 HandleXML 类:

 public class HandleXML {

   private String title = "title";
   private String link = "link";
   private String firsttag = "firsttag";
   private String secondtag = "secondtag";
   private String urlString = null;
   private XmlPullParserFactory xmlFactoryObject;
   public volatile boolean parsingComplete = true;
   public HandleXML(String url){this.urlString = url;}
   public String getTitle(){return title;}
   public String getLink(){return link;}    
   public String getFirstTag(){return firsttag;}
   public String getSecondTag(){return secondtag;}

   public void parseXMLAndStoreIt(XmlPullParser myParser) {
   int event;
   String text=null;
   try {
     event = myParser.getEventType();
     while (event != XmlPullParser.END_DOCUMENT) {
     String name=myParser.getName();
     switch (event){
        case XmlPullParser.START_TAG:
        break;
        case XmlPullParser.TEXT:
           text = myParser.getText();
        break;
        case XmlPullParser.END_TAG:
           if(name.equals("title")){
              title = text;
           }
           else if(name.equals("link")){    
              link = text;
           }
           else if(name.equals("firsttag")){
               firsttag = text;
           }
           else if(name.equals("secondtag")){
               secondtag = text;
            }
           else{
           }
           break;
     }       
     event = myParser.next(); 
   }
   parsingComplete = false;
   } catch (Exception e) {
     e.printStackTrace();
  }
  }

 public void fetchXML(){
 Thread thread = new Thread(new Runnable(){
 @Override
 public void run() {
  try {
     URL url = new URL(urlString);
     HttpURLConnection conn = (HttpURLConnection) url.openConnection();
     conn.setReadTimeout(10000 /* milliseconds */);
     conn.setConnectTimeout(15000 /* milliseconds */);
     conn.setRequestMethod("GET");
     conn.setDoInput(true);
     // Starts the query
     conn.connect();
     InputStream stream = conn.getInputStream();
     xmlFactoryObject = XmlPullParserFactory.newInstance();
     XmlPullParser myparser = xmlFactoryObject.newPullParser();
     myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
     myparser.setInput(stream, null);
     parseXMLAndStoreIt(myparser);
     stream.close();
  } catch (Exception e) {
  }
  }
  });
  thread.start(); 
  }
  }

非常感谢任何帮助!提前致谢。

【问题讨论】:

    标签: java android xml android-fragments rss


    【解决方案1】:

    检查您的代码,这个while 似乎是无限的。

    while(obj.parsingComplete);
    

    我需要查看您的 logcat 或更多信息。

    我不建议您使用变量 true/false 检查线程/异步之间的并发性。你为什么不给你的方法一个监听器/回调,以便在执行后调用?

    一个例子:

    1.声明一个接口,其中包含执行后要调用的方法。

    public interface XMLParserListener{
      //Sample, maybe you have to customize params or return type
      void onParserFinished();
    }
    

    2.让您的片段实现它(或其他实现......这取决于您。我将在您的片段中制作带有实现的示例)。这将使您实现 onParserFinished()。

    3.将你的解析器监听器提供给你的 HandleXML

    obj.fetchXML(this);
    

    4.更改您的 fetchXML 实现并调用回调。

    public void fetchXML(XMLParserListener listener){
     Thread thread = new Thread(new Runnable(){
     @Override
     public void run() {
      try {
       ...
       parseXMLAndStoreIt(myparser);
       stream.close();
       listener.onParserFinished();
      } catch (Exception e) {
       ...
    ...
    

    5.在你的 onParserFinished() 方法中,你可以在解析后实现任何你想做的事情。

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多