【问题标题】:Unable to Decode Stream: fileNotFoundException无法解码流:fileNotFoundException
【发布时间】:2014-09-27 16:55:31
【问题描述】:

基本上,我使用 DOM Parser 从列表视图中的 RSS 提要中检索标题、描述、pubDate 和缩略图。这是我的示例代码。

 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;
                }
                }
        }

我的解析器正确读取了前三个标签..但是缩略图给了我一个问题,并引发了一个异常...

        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")));

【问题讨论】:

  • 只有一件事我能注意到:网址开头有额外的“/”。它应该是“i.dailymail.co.uk/i/pix/2014/09/27/…”。不是“/i.dailymail.co.uk/i/pix/2014/09/27/…
  • 我知道。如果我删除 holder.articleImage.setImageURI(Uri.parse(currentItem.get("imageURL")));在我的适配器的 getView 方法中,我没有看到任何异常..但是图像再次没有出现在列表中..
  • 对.. 但你得到的网址不正确。请检查一下。出于测试目的,您可以尝试硬编码网址,例如:holder.articleImage.setImageURI(Uri.parse("http:/i.dailymail.co.uk/i/pix/2014/09/27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG")); 并检查图像是否显示。 @Theo
  • 没什么好怕的。我按照你的建议做了,得到了这个异常...... 09-27 13:56:40.349: E/AndroidRuntime(2282): FATAL EXCEPTION: main 09-27 13:56:40.349: E/AndroidRuntime(2282): java. lang.NullPointerException: uriString

标签: android exception rss decode


【解决方案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。因此,首先,请确保您在回复中获得正确的 URL。

对于测试,请尝试使用硬编码的 url:

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

我想这应该可以正常工作。因此,只需在响应中进行更正,您就可以开始了。

【讨论】:

  • 如果我注释掉 L.m(currentChild.getAttributes().item(0).getTextContent());在 if(currentChild.getNodeName().equalsIgnoreCase("media:thumbnail")){} 里面,我读取了日志文件中的图像..那部分没问题。正如您向我展示的那样,我将图像图像的链接放在 Uri.parse() 中,但还没有运气。
  • 图像未显示..也是一个例外.....resolveUri 在错误的位图 uri 上失败:http://i.dailymail.co.uk/i/pix/2014/0??9/ 27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG
  • 我得到了和以前一样的异常......无法解码流:java.io.FileNotFoundException:/http:/i.dailymail.co.uk/i/pix/2014/09/ 27/1411832985119_Puff_Image_galleryImage_SUNDERLAND_ENGLAND_SEPTEM.JPG:打开失败:ENOENT(没有这样的文件或目录)..所以setImageURI方法有问题..hmm...
  • 可能是@Theo .. 看看this 是否有帮助。
  • 有没有关于如何在列表视图中加载 url 图片的教程?我没有找到好的东西..只有关于惰性列表等等......
【解决方案2】:

是的。你是对的!!!我必须创建一个单独的 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"));

获取图像并将它们显示到列表中。谢谢你的想法。他们帮了我很多!

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2017-07-23
    相关资源
    最近更新 更多