2013-04-07 107 views
0

我已创建RSS阅读器,如下面的教程: http://techiedreams.com/android-rss-reader-part-3-action-bar-with-animated-item/RSS阅读器的NullPointerException

我的问题是: 当我加载列表(ListActivity.java),我有时会得到一个NullPointerException,我可以只能看到一些列表项中的文本和其他图像中的文本。

的logcat的是:

04-07 22:01:26.900: W/System.err(22141): java.lang.NullPointerException 
04-07 22:01:26.900: W/System.err(22141): at com.td.rssreader.parser.DOMParser.parseXml(DOMParser.java:56) 
04-07 22:01:26.900: W/System.err(22141): at com.td.rssreader.ListActivity$2.run(ListActivity.java:115) 
04-07 22:01:26.900: W/System.err(22141): at java.lang.Thread.run(Thread.java:856) 
04-07 22:01:26.945: D/dalvikvm(22141): GC_CONCURRENT freed 887K, 10% free 13642K/15111K, paused 2ms+13ms, total 34ms 
04-07 22:01:56.425: W/IInputConnectionWrapper(22141): getSelectedText on inactive InputConnection 
04-07 22:01:56.425: W/IInputConnectionWrapper(22141): setComposingText on inactive InputConnection 
04-07 22:01:56.425: W/IInputConnectionWrapper(22141): getExtractedText on inactive InputConnection 
04-07 22:02:03.165: W/IInputConnectionWrapper(22141): showStatusIcon on inactive InputConnection 

DOMParser类线56:

theString = nchild.item(j).getFirstChild().getNodeValue(); 

和ListActivity线115:

 feed = tmpDOMParser.parseXml(feedLink); 

我有什么,为了做到使它工作..?我真的不能在这里找到我的错误:(

编辑:

ListActivity.java

public class ListActivity extends Activity { 

    RSSFeed feed; 
    ListView lv; 
    CustomListAdapter adapter; 
    String feedLink; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.feed_list); 

     // set the feed link for refresh 
     feedLink = new SplashActivity().RSSFEEDURL; 

     // Get feed form the file 
     feed = (RSSFeed) getIntent().getExtras().get("feed"); 

     // Initialize the variables: 
     lv = (ListView) findViewById(R.id.listView); 
     lv.setVerticalFadingEdgeEnabled(true); 

     // Set an Adapter to the ListView 
     adapter = new CustomListAdapter(this); 
     lv.setAdapter(adapter); 

     // Set on item click listener to the ListView 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       // actions to be performed when a list item clicked 
       int pos = arg2; 

       Bundle bundle = new Bundle(); 
       bundle.putSerializable("feed", feed); 
       Intent intent = new Intent(ListActivity.this, 
         DetailActivity.class); 
       intent.putExtras(bundle); 
       intent.putExtra("pos", pos); 
       startActivity(intent); 

      } 
     }); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     new MenuInflater(this).inflate(R.menu.activity_main, menu); 
     return (super.onCreateOptionsMenu(menu)); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.refresh_option: 
      refreshList(item); 
      return (true); 

     case R.id.about_option: 
      Toast.makeText(this, "RSS Reader!", Toast.LENGTH_SHORT).show(); 
      return (true); 

     } 
     return super.onOptionsItemSelected(item); 
    } 

    public void refreshList(final MenuItem item) { 
     /* Attach a rotating ImageView to the refresh item as an ActionView */ 
     LayoutInflater inflater = (LayoutInflater) getApplication() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ImageView iv = (ImageView) inflater.inflate(R.layout.action_refresh, 
       null); 

     Animation rotation = AnimationUtils.loadAnimation(getApplication(), 
       R.anim.refresh_rotate); 
     rotation.setRepeatCount(Animation.INFINITE); 
     iv.startAnimation(rotation); 

     item.setActionView(iv); 

     // trigger feed refresh: 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       DOMParser tmpDOMParser = new DOMParser(); 
       feed = tmpDOMParser.parseXml(feedLink); 

       ListActivity.this.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         if (feed != null && feed.getItemCount() > 0) { 
          adapter.notifyDataSetChanged(); 
          // lv.setAdapter(adapter); 
          item.getActionView().clearAnimation(); 
          item.setActionView(null); 
         } 
        } 
       }); 
      } 
     }); 
     thread.start(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     adapter.imageLoader.clearCache(); 
     adapter.notifyDataSetChanged(); 
    } 

    // List adapter class 
    class CustomListAdapter extends BaseAdapter { 

     private LayoutInflater layoutInflater; 
     public ImageLoader imageLoader; 

     public CustomListAdapter(ListActivity activity) { 

      layoutInflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      imageLoader = new ImageLoader(activity.getApplicationContext()); 
     } 

     @Override 
     public int getCount() { 

      // Set the total list item count 
      return feed.getItemCount(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return position; 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      // Inflate the item layout and set the views 
      View listItem = convertView; 
      int pos = position; 
      if (listItem == null) { 
       listItem = layoutInflater.inflate(R.layout.list_item, null); 
      } 

      // Initialize the views in the layout 
      ImageView iv = (ImageView) listItem.findViewById(R.id.thumb); 
      TextView tvTitle = (TextView) listItem.findViewById(R.id.title); 
      TextView tvDate = (TextView) listItem.findViewById(R.id.date); 

      // Set the views in the layout 
      imageLoader.DisplayImage(feed.getItem(pos).getImage(), iv); 
      tvTitle.setText(feed.getItem(pos).getTitle()); 
      tvDate.setText(feed.getItem(pos).getDate()); 

      return listItem; 
     } 

    } 

} 

DOMParser.java

public class DOMParser { 

    private RSSFeed _feed = new RSSFeed(); 

    public RSSFeed parseXml(String xml) { 

     // _feed.clearList(); 

     URL url = null; 
     try { 
      url = new URL(xml); 
     } catch (MalformedURLException e1) { 
      e1.printStackTrace(); 
     } 

     try { 
      // Create required instances 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 

      // Parse the xml 
      Document doc = db.parse(new InputSource(url.openStream())); 
      doc.getDocumentElement().normalize(); 

      // Get all <item> tags. 
      NodeList nl = doc.getElementsByTagName("item"); 
      int length = nl.getLength(); 

      for (int i = 0; i < length; i++) { 
       Node currentNode = nl.item(i); 
       RSSItem _item = new RSSItem(); 

       NodeList nchild = currentNode.getChildNodes(); 
       int clength = nchild.getLength(); 

       // Get the required elements from each Item 
       for (int j = 1; j < clength; j = j + 2) { 

        Node thisNode = nchild.item(j); 
        String theString = null; 
        String nodeName = thisNode.getNodeName(); 

        theString = nchild.item(j).getFirstChild().getNodeValue(); 

        if (theString != null) { 
         if ("title".equals(nodeName)) { 
          // Node name is equals to 'title' so set the Node 
          // value to the Title in the RSSItem. 
          _item.setTitle(theString); 
         } 

         else if ("description".equals(nodeName)) { 
          _item.setDescription(theString); 

          // Parse the html description to get the image url 
          String html = theString; 
          org.jsoup.nodes.Document docHtml = Jsoup 
            .parse(html); 
          Elements imgEle = docHtml.select("img"); 
          _item.setImage(imgEle.attr("src")); 
         } 
//description 
         else if ("pubDate".equals(nodeName)) { 

          // We replace the plus and zero's in the date with 
          // empty string 
          String formatedDate = theString.replace(" +0000", 
            ""); 
          _item.setDate(formatedDate); 
         } 


         if ("link".equals(nodeName)) { 
          // Node name is equals to 'title' so set the Node 
          // value to the Title in the RSSItem. 
          _item.setLink(theString); 
         } 
        } 
       } 

       // add item to the list 
       _feed.addItem(_item); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Return the final feed once all the Items are added to the RSSFeed 
     // Object(_feed). 
     return _feed; 
    } 

} 
+0

我们需要更多coooooooode! – Zyerah 2013-04-07 19:10:01

+0

@Telthien我已经添加了这两个类:)你需要更多的东西吗? – 2013-04-07 19:12:06

+0

也许少一点,甚至:P这是有点难以通过。 – Zyerah 2013-04-07 19:13:16

回答

3

所以你得到一个java.lang.NullPointerException来自:

theString = nchild.item(j).getFirstChild().getNodeValue(); 

的问题是,你不是活得t null检查和只是阿umi因为一切都不是null,因此该行中的其中一个调用返回null,然后您试图调用其他方法。另外,你需要一些代码组织。

for (int j = 1; j < clength; j = j + 2) { 

     Node thisNode = nchild.item(j); 

     String theString = null; 
     if (thisNode != null && thisNode.getFirstChild() != null) { 
      theString = thisNode.getFirstChild().getNodeValue(); 
     } 

     if (theString != null) { 
      String nodeName = thisNode.getNodeName(); 
      // rest of your code 

注意:这里是你有什么...

  for (int j = 1; j < clength; j = j + 2) { 

       Node thisNode = nchild.item(j); 
       String theString = null; 
       String nodeName = thisNode.getNodeName(); 

       theString = nchild.item(j).getFirstChild().getNodeValue(); 
       if (theString != null) { 
         // rest of your code 

试图使用你的对象,如在此之前添加一些null检查,这将解决您的眼前NullPointerException,你可能有其他错误,这可能无法解决所有问题(您的代码仍然非常有说服力),但是这应该可以解决您发布的问题。

+0

谢谢@Steven Byle!这解决了空指针,但我仍然没有得到任何文字或图像...和错误getSelectedText无效InputConnection等仍然... – 2013-04-07 19:43:58

+0

当我没有图像我没有描述太... :(当我不是获取文本我也无法得到链接 – 2013-04-07 19:46:00

+1

对,你需要花一些时间来确保你的代码可以创建部分数据对象,如果某些数据没有返回。这更多的是根据返回的数据来决定你希望它的行为。问题的范围围绕着NPE,我相信现在已经解决了NPE。如果您还有其他问题,请随时提出另一个问题。 – 2013-04-07 19:49:13