Android:下载图片时出现大错误

时间:2011-03-19 06:43:56

标签: android

我尝试了三种下载图像的方法。所有Stackoverflow成员都建议。 所有这三种方法都无法从服务器下载所有图像。很少下载,很少没有。

我注意到每个方法都无法从特定位置下载图像。 这就是方法3总是无法下载前三个图像。我改变了图像,但即使这样,也不会下载前三张图像。

方法1:

 public Bitmap downloadFromUrl( String imageurl )
   {
       Bitmap bm=null;
       String imageUrl = imageurl;
       try {
               URL url = new URL(imageUrl); //you can write here any link

              URLConnection ucon = url.openConnection();


             InputStream is = ucon.getInputStream();
              BufferedInputStream bis = new BufferedInputStream(is);


               ByteArrayBuffer baf = new ByteArrayBuffer(50);
              int current = 0;
              while ((current = bis.read()) != -1) {
                       baf.append((byte) current);
              }

             bm= BitmapFactory.decodeByteArray(baf.toByteArray(), 0, baf.toByteArray().length);


     } catch (IOException e) {
               Log.d("ImageManager", "Error: " + e);
     }
       return bm;

   }

这里错过图像的错误是:SKIimagedecoder,工厂返回null。

方法:2

 public static Bitmap loadBitmap(String url) 
   {
       Bitmap bitmap = null;
       InputStream in = null;
       BufferedOutputStream out = null;

       try {
           in = new BufferedInputStream(new URL(url).openStream(), 4*1024);

           final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
           out = new BufferedOutputStream(dataStream,  4 * 1024);

           int byte_;
           while ((byte_ = in.read()) != -1)
               out.write(byte_);
           out.flush();

           final byte[] data = dataStream.toByteArray();
           BitmapFactory.Options options = new BitmapFactory.Options();
           //options.inSampleSize = 1;

           bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
       } catch (IOException e) {
           System.out.println(e);
           Log.e("","Could not load Bitmap from: " + url);
       } finally {
           try{
               in.close();
               out.close();
           }catch( IOException e )
           {
               System.out.println(e);
           }
       }

       return bitmap;
   }

我到达的错误与上述相同。

方法3:

private Bitmap downloadFile(String fileUrl){
    URL bitmapUrl =null;  
    Bitmap bmImg = null;
    try {
        bitmapUrl= new URL(fileUrl);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }

    HttpGet httpRequest = null;

    try {
            httpRequest = new HttpGet(bitmapUrl.toURI());
    } catch (URISyntaxException e) {
            e.printStackTrace();
    }

    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response = (HttpResponse) httpclient
                .execute(httpRequest);

        HttpEntity entity = response.getEntity();
        BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
        InputStream instream = bufHttpEntity.getContent();
        bmImg = BitmapFactory.decodeStream(instream);
    } catch (Exception e) {
            System.out.println(e);
    }
    return bmImg;
}

我得到的错误是:org.apache.http.NoHttpResponseException:目标服务器无法响应。

请帮忙。这是阻止我完成项目的唯一因素。

3 个答案:

答案 0 :(得分:0)

看看这个..清楚地解释了从服务器下载图像.. Image from Server ....

答案 1 :(得分:0)

我假设您正在下载要显示的图像,而不仅仅是保存在设备上。如果是这种情况,我建议您使用Droid-Fu,更具体地说WebImageView。您可以将URL传递给WebImageView,它会尽可能地加载图像,这样可以避免由于连接超时而导致图像无法加载,我猜这是您遇到的问题。

在XML中:

<com.github.droidfu.widgets.WebImageView
    android:id="@+id/image"
    android:layout_width="70dip"
    android:layout_height="70dip"
    droidfu:autoLoad="true"
    droidfu:progressDrawable="..."
/>

在代码中:

WebImageView  image = (WebImageView) convertView.findViewById(R.id.image);
image.setImageUrl(image_url);
image.loadImage();

答案 2 :(得分:0)

您创建位图可能需要时间,因此连接超时。您可能会获得对所有输入流的引用,然后下载并创建。这是一个粗略的答案,但如果推理是正确的,你可以改进它:

public Bitmap[] downloadFromUrl(String[] imageUrls)
{
    Bitmap[] bm = new Bitmap[imageUrls.length];
    BufferedInputStream[] bis = new BufferedInputStream[imageUrls.length];
    for (int i = 0; i < imageUrls.length; i++)
    {
        try
        {
            URL url = new URL(imageUrls[i]); // you can write here any link
            URLConnection ucon = url.openConnection();

            InputStream is = ucon.getInputStream();
            bis[i] = new BufferedInputStream(is);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    for (int i = 0; i < bis.length; i++)
    {
        try
        {
            ByteArrayBuffer baf = new ByteArrayBuffer(50);
            int current = 0;
            while ((current = bis[i].read()) != -1)
            {
                baf.append((byte) current);
            }

            bm[i] = BitmapFactory.decodeByteArray(baf.toByteArray(), 0, baf.toByteArray().length);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    return bm;

}