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 图像的活动时,它不会出现在设备 Galaxy 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);
            }   

        }

第一次工作正常,但我认为第二次内存不足是由于隐式运行的垃圾收集器太多,而且我的图像初始化也一次又一次地运行,这是导致性能不佳的原因游戏,我所做的是我只是手动添加了垃圾收集器

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 回答