0

私のアプリでは、画像のURLの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();

最小限の画像がある場合、つまり配列内の最小限のURLがある場合は、正常に機能します。または、ネットワークが非常に高速な場合は正常に機能します。それ以外の場合は、Forceを閉じます。

この問題を修正するように提案してください。よろしくお願いします。。。。

4

3 に答える 3

0

準備する代わりに、つまりURLArrayList<Bitmap>のみを管理する必要がありますArrayList<String>

なぜArrayListを管理する必要があるのですか?そしてどうやって?

画像がダウンロードされるとキャッシュされ、必要に応じてキャッシュから読み込まれるように、画像キャッシュアルゴリズムを使用する必要があります。実際に管理するのは簡単でしょう。

于 2012-12-31T12:31:47.960 に答える
0

Asynctaskの実行中にエラーが発生しました。コードが正しく機能していません。

代わりにライブラリを使用してみてください。https://github.com/nostra13/Android-Universal-Image-Loaderを試してください。

または、これはhttp://android-developers.blogspot.com.br/2010/07/multithreading-for-performance.htmlで、チュートリアルとデモコードがあります。すでにテスト済みで、すべてのAPIで完全に機能します。

于 2012-12-31T12:43:10.870 に答える
0

確実に閉じるために、最後のブロックでInputstreamを閉じる必要があります。

また、ifclauseでOpenHTTPConnectionのInputStreamを返すか、例外をスローする必要があります。これにより、接続が開かれ、問題がないことを確認できます。これにより、nullが返され、問題が発生する可能性があります。

それを試して、いくつかのフィードバックを与えてください。

于 2012-12-31T12:43:30.610 に答える