2016-11-25 17 views
-1

ビットマップを扱うのが一般的な問題だとわかっていますが、これを例を用いてどうやって進めるのか分かりません。特に画像ビューのサイズが大きくないので、メモリエラーが発生するはずです。ビットマップを作成するのではなく、5秒ごとに表示するのではなく、どのようにすればよいか分からないからです。まず、ビットマップを作成するためのコード。OutOfMemoryエラーが必要な解決策

JavaクラスtrapViews

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    int x = 20; 
    Random r = new Random(); 
    int i1 = r.nextInt(900 - 200) + 200; 
    rnd = new Random(); 
    //Linke Seite 

    System.gc(); 

    Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart); 
    Bitmap resizedBitmap = Bitmap.createScaledBitmap(image, i1, 300, true); 
     float left = (float) 0; 
     float top = (float) (getHeight() - resizedBitmap.getHeight()); 
     canvas.drawBitmap(resizedBitmap, left, top, paint); 

     //rechte Seite 
     Bitmap images = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart1); 
     Bitmap resizedBitmaps = Bitmap.createScaledBitmap(images, getWidth()-resizedBitmap.getWidth()-OwlHole, 300, true); 
     float left1 = (float) (getWidth() - resizedBitmaps.getWidth()); 
     float top1 = (float) (getHeight() - resizedBitmaps.getHeight()); 
     canvas.drawBitmap(resizedBitmaps, left1, top1, paint); 
    } 
} 

は、ランダムな長さで画面の右側と左側に描画可能を作成します。

今、私はHandlerMainActivityに5秒ごとにこれを呼び出す:私はそれが仕事をしたいよう

final Handler h = new Handler(); 
Runnable r = new Runnable() { 
    public void run() { 
     System.gc(); 
     traps(); 
     h.postDelayed(this,5000); // Handler neustarten 
    } 
} 

private void traps() { 
    container = (ViewGroup) findViewById(R.id.container); 
    trapViews tv = new trapViews(this); 
    container.addView(tv, 
     ViewGroup.LayoutParams.MATCH_PARENT, 
     ViewGroup.LayoutParams.MATCH_PARENT); 
    //tV.setImageCount(8); 
    h.postDelayed(r, 5000); 
} 

まず、それが働いています。しかし、新しい引出しが出現するたびに私のゲームは遅れており、5-6回後にはそれが落ちていく。

System.gc()bitmap.recycleの機能はうまくいっていない。誰かが解決策を持っていますか?

+3

なぜメソッドスコープで何度も読んだりデコードしたりするのはなぜですか?オブジェクトを構築して再利用するときは、一度行います。 – duffymo

+0

私は何をしたいのかね。しかし、私は方法を取得しないでください。例はありますか? – Hendrx

+0

Runnable/Callableクラスのコンストラクタで行うか、onDrawを所有するクラスで行います。私は2番目を好むだろう。 – duffymo

答えて

1

5秒ごとにビットマップを作成していますが、ビットマップは常に同じであるため、良い考えではありません。代わりに一度作成する必要があります。

trapViews extends View{ 
    Bitmap image; 
     Bitmap resizedBitmap; 


     //rechte Seite 
     Bitmap images ; 
     Bitmap resizedBitmaps; 

trapViews(Context c){ 
image = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart); 
images = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart1); 

} 

@Override 
protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     int x = 20; 
     Random r = new Random(); 
     int i1 = r.nextInt(900 - 200) + 200; 
     rnd = new Random(); 
     //Linke Seite 
      //I have left this bitmap in the here as it is affected by the random int 
     resizedBitmap = Bitmap.createScaledBitmap(image, i1, 300, true); 
      float left = (float) 0; 
      float top = (float) (getHeight() - resizedBitmap.getHeight()); 
      canvas.drawBitmap(resizedBitmap, left, top, paint); 

      //create this bitmap here as getWidth() will return 0 if created in the view's constructor 
     if(resizedBitmaps == null) 
     resizedBitmaps = Bitmap.createScaledBitmap(images, getWidth()-resizedBitmap.getWidth()-OwlHole, 300, true); 
      float left1 = (float) (getWidth() - resizedBitmaps.getWidth()); 
      float top1 = (float) (getHeight() - resizedBitmaps.getHeight()); 
      canvas.drawBitmap(resizedBitmaps, left1, top1, paint); 

} 


} 
+0

これに感謝niza :) – Hendrx

+0

ようこそ。これがあなたが望むものなら答えを受け入れる –

1

Bitmap.recycle()は、ビットマップを置き換えた後、またはそれが見えなくなった後に呼び出すことを忘れないでください。 複数のビットマップを作成することは問題ではありませんが、メモリを解放するためにリサイクルを使用せずに未使用のオブジェクトを残しました。

+0

はい、私はそれをリサイクルする前に10ビットマップを同時に表示するのは大丈夫だと思います。最初の1ビットマップで遅れて表示されるので、私の問題はリサイクル機能と関係があるとは思えません。 – Hendrx

+0

ビットマップの初期状態のサイズはどのくらいですか? – Farasy

関連する問題