从url下载图像并将其保存在arraylist中

时间:2012-12-31 12:23:23

标签: android image bitmap httpconnection

在我的应用程序中,我有一个图像网址的Arraylist,必须下载为位图并保存在另一个Arraylist中,以便我可以将它们设置为mapview中的地图标记。我的代码是

for( int i=0 ; i < Get_Feed_image.size() ; i++)
{
    Get_Feed_image_bitmap.add(DownloadImage(Get_Feed_image.get(i)));
}

我的DownloadImage方法:

private Bitmap DownloadImage(String URL) 
    {
        Bitmap bitmap = null;
        InputStream in = null;
        try 
        {
            in = OpenHttpConnection(URL);
            bitmap = BitmapFactory.decodeStream(in);
            in.close();
        }
        catch (IOException e1) 
        {
            e1.printStackTrace();
        }
        return bitmap;
    }

    private InputStream OpenHttpConnection(String urlString) throws IOException 
    {
        InputStream in = null;
        int response = -1;

        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();

        if (!(conn instanceof HttpURLConnection))
            throw new IOException("Not an HTTP connection");

        try 
        {
            HttpURLConnection httpConn = (HttpURLConnection) conn;
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.connect();

            response = httpConn.getResponseCode();
            if (response == HttpURLConnection.HTTP_OK) 
            {
                in = httpConn.getInputStream();
            }
        }
        catch (Exception ex) 
        {
            throw new IOException("Error connecting");
        }
        return in;
    }

我得到了Logcat,

12-31 17:29:43.269: E/AndroidRuntime(14572): FATAL EXCEPTION: AsyncTask #5
12-31 17:29:43.269: E/AndroidRuntime(14572): java.lang.RuntimeException: An error occured while executing doInBackground()
12-31 17:29:43.269: E/AndroidRuntime(14572):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at java.lang.Thread.run(Thread.java:1019)
12-31 17:29:43.269: E/AndroidRuntime(14572): Caused by: java.lang.NullPointerException
12-31 17:29:43.269: E/AndroidRuntime(14572):    at com.live.Feed.DownloadImage(Feed.java:279)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at com.live.Feed.access$1(Feed.java:271)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at com.live.Feed$Startsyntask.doInBackground(Feed.java:383)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at com.live.Feed$Startsyntask.doInBackground(Feed.java:1)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-31 17:29:43.269: E/AndroidRuntime(14572):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
12-31 17:29:43.269: E/AndroidRuntime(14572):    ... 4 more

我在in.close();

收到我的强制关闭

如果有最小的图像,我的意思是阵列中的网址最小,它工作正常。 或者,如果我的网络非常快,它可以正常工作。否则我会强制关闭。

建议我解决此问题,先谢谢。 。 。 。

3 个答案:

答案 0 :(得分:0)

您应该只管理ArrayList<Bitmap>,即管理

,而不是准备ArrayList<String>

为什么要管理ArrayList?以及如何?

您应该使用图像缓存算法,以便在下载图像后,它将被缓存并在需要时从缓存加载。实际上很容易管理。

答案 1 :(得分:0)

您在执行Asynctask时遇到错误,您的代码执行不正确。

尝试使用库,尝试使用https://github.com/nostra13/Android-Universal-Image-Loader

或者这个http://android-developers.blogspot.com.br/2010/07/multithreading-for-performance.html,它有一个教程和一个演示代码,我已经测试过并且在所有API中都很完美。

答案 2 :(得分:0)

您应该在finnaly块中关闭Inputstream,以确保它将关闭。

你也应该在ifclause中返回OpenHTTPConnection的InputStream,否则抛出一个Exception,这样就可以确保连接已经打开并且没问题,因为你这样做也可能会返回null,这可能会导致你的问题

尝试并提供一些反馈。

相关问题