2014-09-27 61 views
1

基本上我使用DOM解析器從列表視圖中的RSS源中檢索標題,描述,發佈日期和縮略圖。這是我的示例代碼。無法解碼流:fileNotFoundException

public ArrayList<HashMap<String, String>> processXML(
       InputStream inputStream) throws Exception { 
       DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory 
       .newInstance(); 
       DocumentBuilder documentBuilder = documentBuilderFactory 
       .newDocumentBuilder(); 
       Document xmlDocument = documentBuilder.parse(inputStream); 
       Element rootElement = xmlDocument.getDocumentElement(); 
       L.m("" + rootElement.getTagName()); 
       NodeList itemsList = rootElement.getElementsByTagName("item"); 
       NodeList itemChildren = null; 
       Node currentItem = null; 
       Node currentChild = null; 
       NamedNodeMap mediaThumbnailAttr = null; 
       Node currentAttribute=null; 
       int count = 0; 
       ArrayList<HashMap<String, String>> results = new ArrayList<>(); 
       HashMap<String, String> currentMap = null; 
       for (int i = 0; i < itemsList.getLength(); i++) { 
       currentItem = itemsList.item(i); 
       itemChildren = currentItem.getChildNodes(); 
       currentMap = new HashMap<>(); 
       for (int j = 0; j < itemChildren.getLength(); j++) { 
       currentChild = itemChildren.item(j); 
       if (currentChild.getNodeName().equalsIgnoreCase("title")) { 
       // L.m(currentChild.getTextContent()); 
       currentMap.put("title", currentChild.getTextContent()); 
       } 
       if (currentChild.getNodeName().equalsIgnoreCase("pubDate")) { 
       // L.m(currentChild.getTextContent()); 
       currentMap 
       .put("pubDate", currentChild.getTextContent()); 
       } 
       if (currentChild.getNodeName().equalsIgnoreCase(
       "description")) { 
       // L.m(currentChild.getTextContent()); 
       currentMap.put("description", 
       currentChild.getTextContent()); 
       } 

       if(currentChild.getNodeName().equalsIgnoreCase("media:thumbnail")){ 
        //L.m(""+currentChild.getTextContent()); 
        mediaThumbnailAttr = currentChild.getAttributes(); 
        for(int k=0;k<mediaThumbnailAttr.getLength(); 
          k++){ 
         currentAttribute = mediaThumbnailAttr.item(k); 
         if(currentAttribute.getNodeName() 
           .equalsIgnoreCase("url")){ 
          count++; 

          //L.m(currentChild.getAttributes().item(0).getTextContent()); 

         } 
         //L.m(); 
         currentMap.put("imageURL", currentChild 
       .getAttributes().item(0).getTextContent()); 
        } 
        count=0; 
       } 
       } 
       if (currentMap != null && !currentMap.isEmpty()) { 
       results.add(currentMap); 
       } 
       count = 0; 
       } 
       return results; 
       } 
       } 
     } 

前三個標籤是由我的parser..But正確讀取縮略圖是給了我一個問題,我拋出一個異常...

 Unable to decode stream: java.io.FileNotFoundException: 
      /http:/i.dailymail.co.uk/i/pix/2014/09/27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG: open failed: ENOENT (No such file or directory). 

是否與 setImageURI任何問題(Uri.parse(currentItem.get( 「IMAGEURL」)));

+0

只是我可以注意到的一件事:在Url的開頭添加了「/」。它應該是「http://i.dailymail.co.uk/i/pix/2014/09/27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG」。不是「/images/i/dailymail.co.uk/i/pix/2014/09/27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG」 – 2014-09-27 17:38:19

+0

我知道。如果我刪除holder.articleImage.setImageURI(Uri.parse(currentItem.get(「imageURL」)));在我的適配器的getView方法裏面我沒有看到任何異常..但是圖像沒有出現在列表中.. – Theo 2014-09-27 17:42:02

+0

沒錯..但是你得到了不正確的url。請檢查。出於測試目的,您可以嘗試使用硬編碼網址,如:holder.articleImage.setImageURI(Uri.parse(「http:/i.dailymail.co.uk/i/pix/2014/09/27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG」)) ;'並檢查圖像是否顯示。 @Theo – 2014-09-27 17:53:21

回答

1

的錯誤是:

Unable to decode stream: java.io.FileNotFoundException: 
     /http:/i.dailymail.co.uk/i/pix/2014/09/27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG: open failed: ENOENT (No such file or directory). 

查看 「/」 的URL開始之前。這是造成FileNotFoundException。所以首先,確保在回覆中獲得正確的網址。

以及測試,請嘗試使用硬編碼網址:

holder.articleImage.setImageURI(Uri.parse("http:/i.dailymail.co.uk/i/pix/2014/0‌​9/27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG")); 

我想這應該能正常運行。所以只需要做出相應的改正,你就可以走了。

+0

如果我註釋掉Lm(currentChild.getAttributes()。item(0).getTextContent());這是在if(currentChild.getNodeName()。equalsIgnoreCase(「media:thumbnail」)){},我讀日誌文件中的圖像..這部分是好的。我將圖像圖像的鏈接放到了Uri.parse()中,就像您向我展示的一樣,但沒有運氣。 – Theo 2014-09-27 18:08:12

+0

有什麼錯誤嗎?或圖像未顯示? – 2014-09-27 18:11:52

+0

圖片未顯示..也有例外..... resolveUri在錯誤的位圖上失敗uri:http:/i.dailymail.co.uk/i/pix/2014/0 ?? 9/27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG – Theo 2014-09-27 18:13:40

1

是的。你是對的!!!我不得不創建一個單獨的AsyncTask下載圖像..

public class ImageDownloader extends AsyncTask<String, String, Bitmap> { 

    private MyAdapter parentActivity; 


    public ImageDownloader(MyAdapter parentActivity) { 
    super(); 

    this.parentActivity = parentActivity; 
} 

    protected Bitmap doInBackground(String... args) { 
    try { 
     Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent()); 
     return bitmap; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

    protected void onPostExecute(Bitmap image) { 
    if(image != null){ 
     parentActivity.updateBitmap(image); 

    } 
    } 
} 

而且還

new ImageDownloader(MyAdapter.this).execute(currentItem.get("imageURL")); 

獲得的圖像,並顯示他們到列表中。感謝您的想法。他們幫了我很多!