4

AsyncTask を介して読み込まれた画像の小さなサムネイルがあり、画像の URL を imageView にスローするスクロールビューがあります。

それらは動的に追加され、その上に、クリックしたサムネイルの画像を保持するメインの imageView があります。

サムネイルに約10枚以上の画像が表示されるまで、すべてがうまく機能します...

サムネイルと同じ方法で mainImage の URL を読み込んでいるので、親指で画像をクリックすると、一番上に読み込まれます。

メソッド自体でビットマップをリサイクルしていますが、10 個を超える画像を読み込むとメモリが不足してクラッシュするようです (サムネイルは正常に読み込まれますが、クリックしてメイン画像を読み込むとクラッシュします)。

任意の助けをいただければ幸いです

これは、画像をロードするために使用しているコードです(サムネイル+メイン):

    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
      ImageView bmImage;

      public DownloadImageTask(ImageView bmImage) {
          this.bmImage = bmImage;
      }

  protected Bitmap doInBackground(String... urls) {
      String urldisplay = urls[0];
      Bitmap mIcon11 = null;
      try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
      } catch (Exception e) {
          Log.e("Error", e.getMessage());
          e.printStackTrace();
      }
      return mIcon11;
  }

  protected void onPostExecute(Bitmap result) {
      bmImage.setImageBitmap(result);
  }
    }
4

8 に答える 8

1

次の2つのAndroid公式チュートリアルを読む必要があります。大きなビットマップを効率的にロードする方法を説明し、本番アプリで使用する実用的なコードサンプルを提供します

ビットマップを効率的に表示する

大きなビットマップを効率的にロードする

于 2012-11-30T14:38:20.083 に答える
1

入力ストリームを閉じていません。そのため、画像のURLが実行されると、常に高価でOutofMemoryErrorの原因となる入力ストリームオブジェクトが作成されます。catchブロックの後に以下のコードを追加します。

in.close();
in = null;
于 2012-11-30T14:39:39.563 に答える
1

これをあなたの画像に実装するだけです...それはあなたの画像を4倍に減らします

public static Bitmap getImage(byte[] image) {
        BitmapFactory.Options config = new BitmapFactory.Options();
        config.inPreferredConfig = Bitmap.Config.RGB_565;
        config.inSampleSize = 4;
        return BitmapFactory.decodeByteArray(image, 0, image.length,config);

    }
于 2012-11-30T14:23:33.890 に答える
0

私はこれを使用します..

Options opt = new Options();
opt.inPurgeable = true;
opt.inInputShareable = true;
opt.inPreferredConfig = Bitmap.Config.RGB_565;
于 2013-07-01T08:25:12.590 に答える
0

おそらく、ビットマップの何らかのキャッシュ戦略を使用する必要があります。ライブラリUniversal Image Loaderを調べてみてください。必要なものに対して非常にうまく機能します。

自分でビットマップをリサイクルすることは、それがもう使用されないことが確実にわかっている場合にのみ行うべきです。

于 2012-11-30T14:23:28.647 に答える
0

android:largeHeap="true" を使用して、より大きなヒープ サイズをリクエストできます

答え

于 2013-06-19T08:09:16.920 に答える
0

ビットマップのサイズをより小さいサイズに変更してみてください (1.5 のような係数で、例: width=widt*1.5)、ビューでストレッチ (xy に合わせるなど) します。決定した係数により、画像の品質が低下します。それはすぐに汚い方法です。また、Niun Goia の言及のようにビットマップ rgb を作成することもうまく機能します。

于 2012-11-30T14:38:16.680 に答える
0

これには ScrollView を使用しないでください。ListView を使用する必要があります。ScrollView を (その中に LinearLayout などを使用して) 使用すると、リスト内のすべての要素 (サイズに関係なく) がすぐに読み込まれようとします。代わりに ListView を試してください (これは正確な理由で作成され、表示されている行の ui 要素のみをメモリにロードします)。

于 2012-11-30T14:49:10.883 に答える