如何修复 Android 上的图像下载/保存错误

Posted

技术标签:

【中文标题】如何修复 Android 上的图像下载/保存错误【英文标题】:How to fix an image downloading/saving error on Android 【发布时间】:2013-01-27 06:39:16 【问题描述】:

我正在编写一个 android 应用程序,在该应用程序中我从互联网上获取一些图像以显示在画廊中。图像首先保存到磁盘,然后由设置为 FragmentStatePagerAdapter 的 ViewPager 中的片段获取。

我遇到的问题是,在下载第三张图片后,之后的任何图片都会导致 NullPointerException,其中 URL 显然为空。这是我使用的 downloadBitmap() 方法:

    static Bitmap downloadBitmap(String url) 
    final AndroidHttpClient client = AndroidHttpClient
            .newInstance("Android");
    final HttpGet getRequest = new HttpGet(url);

    try 
        HttpResponse response = client.execute(getRequest);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != HttpStatus.SC_OK) 
            Log.w("ImageDownloader", "Error " + statusCode
                    + " while retrieving bitmap from " + url);
            return null;
        

        final HttpEntity entity = response.getEntity();
        if (entity != null) 
            InputStream inputStream = null;
            try 
                inputStream = entity.getContent();
                final Bitmap bitmap = BitmapFactory
                        .decodeStream(inputStream);
                return bitmap;
             finally 
                if (inputStream != null) 
                    inputStream.close();
                
                entity.consumeContent();
            
        
     catch (Exception e) 
        // Could provide a more explicit error message for IOException or
        // IllegalStateException
        getRequest.abort();
        Log.w("ImageDownloader", "Error while retrieving bitmap from "
                + url);
     finally 
        if (client != null) 
            client.close();
        
    
    return null;

同样,下载第三张图像后,该方法开始吐出错误,指出“从检索位图时出错”,但没有在末尾附加 URL,这意味着我正在向该方法传递空字符串或空白字符串。但是,情况并非如此,因为在使用 Log.d("URL", saidURL) 运行方法之前记录我传递的 URL 字符串表明 URL 完全有效。 downloadBitmap() 代码在以下 AsyncTask 中调用。

    class RetrieveImagesTask extends
        AsyncTask<ArrayList<Magazine>, String, ArrayList<Magazine>> 

    @Override
    protected ArrayList<Magazine> doInBackground(
            ArrayList<Magazine>... arg0) 

        Bitmap bitmap;
        for (Magazine mag : arg0[0]) 
            if (!new File(filesDir, mag.ID + ".jpg").exists())
                try 
                    FileOutputStream out = new FileOutputStream(filesDir + mag.ID
                            + ".jpg");
                    Log.d("URL", mag.imageURL);
                    bitmap = downloadBitmap(mag.imageURL);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
                 catch (Exception e) 
                    e.printStackTrace();
                
        
        return arg0[0];
    

对这种奇怪的情况有什么帮助吗?会不会是内存不足的问题?

【问题讨论】:

能否通过将catch部分更改为e.printStackTrace()来发布异常详细信息。 原来我从中获取 URL 的服务器有一半时间给我提供了空 URL 字符串。 【参考方案1】:
static Bitmap downloadBitmap(String url) 
final AndroidHttpClient client = AndroidHttpClient
        .newInstance("Android");
final HttpGet getRequest = new HttpGet(url);

try 
    HttpResponse response = client.execute(getRequest);
    final int statusCode = response.getStatusLine().getStatusCode();
    if (statusCode != HttpStatus.SC_OK) 
        Log.w("ImageDownloader", "Error " + statusCode
                + " while retrieving bitmap from " + url);
        return null;
    

    final HttpEntity entity = response.getEntity();
    if (entity != null) 
        InputStream inputStream = null;
        try 
            inputStream = entity.getContent();


            final Bitmap bitmap;

 int h = 100; // height in pixels
                int w = 100; // width in pixels
                if (bitmap != null) 
                    bitmap = Bitmap.createScaledBitmap(
                            BitmapFactory
                    .decodeStream(inputStream), h, w, true);

            return bitmap;
         finally 
            if (inputStream != null) 
                inputStream.close();
            
            entity.consumeContent();
        
    
 catch (Exception e) 
    // Could provide a more explicit error message for IOException or
    // IllegalStateException
    getRequest.abort();
    Log.w("ImageDownloader", "Error while retrieving bitmap from "
            + url);
 finally 
    if (client != null) 
        client.close();
    

return null;

【讨论】:

以上是关于如何修复 Android 上的图像下载/保存错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在上传图像时修复WordPress上的HTTP错误?

如何修复 Windows 10 上的 Android Studio adb 错误?

有关如何修复Android手机上的SSL连接错误的快速指南

如何修复变换比例上的模糊图像

有啥办法可以在 Mac 上的 android studio 3.5.1 中修复这个错误

将图像从 Android 上的可绘制资源保存到 sdcard