0

私はAndroidアプリケーションを開発しています。このアプリケーションでは、次のコードでgif画像を使用しています。

private static byte[] streamToBytes(InputStream is) {
    ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
    byte[] buffer = new byte[1024];
    int len;
    try {
        while ((len = is.read(buffer)) >= 0) {
            os.write(buffer, 0, len);
        }
    } catch (java.io.IOException e) {
    }
    return os.toByteArray();
}

//クラスのコンストラクター内

is = this.context.getResources().openRawResource(R.drawable.fondo_juego_nexus);

            if (DECODE_STREAM) {
                  System.out.println("in if DECODE_STREAM");
                mMovie = Movie.decodeStream(is);
            } 

            else {
                byte[] array = streamToBytes(is);
                System.out.println("in else  DECODE_STREAM");
                mMovie = Movie.decodeByteArray(array, 0, array.length);
           }



// In On Draw 

  long now = android.os.SystemClock.uptimeMillis();

        if (mMovieStart == 0) {   // first time
            mMovieStart = now;
        }
        if (mMovie != null) {
            System.out.println("in if (mMovie != null)  " + mMovie.duration());
            int dur = mMovie.duration();
            if (dur == 0) 
            {
                dur = 1000;
                System.out.println("in if movie if");
            }
            System.out.println("duration is  "+ dur);
            int relTime = (int)((now - mMovieStart) % dur);
            mMovie.setTime(relTime);
            System.out.println("in if displaying syd");
            mMovie.draw(canvas,120,100);

        }

そしてontouchによって私は次のような活動を終了します

else if(_y<=60 &&  _x<=60)
         {


             sp.play(mySound1, volume, volume, 0, 0, 1);
             sp.release();
            playr.stop();
             tme.cancel();
             act.finish();

}

上記の方法でアクティビティを終了し、前のアクティビティに戻って、gif画像を使用しているアクティビティに戻ると、デバイスギャラクシーs2、2.3.3では表示されませんが、同じサイズのエミュレータでは2.2です。結構です

このアプローチに問題はありますか、またはgif画像を表示するためにどのように使用できますか

このエラーを削除するにはどうすればよいですか

4

1 に答える 1

1

私は自分の問題の解決策を手に入れました、それがどれほど良いかはわかりませんが、以前はコンストラクターでこのコードを使用していました

 if (DECODE_STREAM) {
                mMovie = Movie.decodeStream(is);
            } else {
                byte[] array = streamToBytes(is);
                mMovie = Movie.decodeByteArray(array, 0, array.length);
            }   

        }

最初は問題なく動作しましたが、2回目は、暗黙的に実行されていたガベージコレクターが多すぎてメモリが不足し、イメージの初期化も何度も実行されていたため、パフォーマンスが低下したと思います。ゲーム、そして私がしたことは、ガベージコレクターを手動で追加したことです

System.gc();

この後、すべての画像を初期化し、次のコードを配置しました

if (DECODE_STREAM) {
                mMovie = Movie.decodeStream(is);
            } else {
                byte[] array = streamToBytes(is);
                mMovie = Movie.decodeByteArray(array, 0, array.length);
            }   

        }

この後、ガベージコレクターの暗黙的な実行を回避しました

そして今、gif画像は正常に機能しています

于 2012-04-20T06:43:43.433 に答える