2012-01-04 43 views
0

當使用在佈局中創建的自定義視圖時,我在Android中收到標準java.lang.OutOfMemoryError。我正在使用位圖,但我不明白的是,只有當設備進入睡眠模式時纔會發生這種情況。我調試了代碼,並發現當設備進入睡眠模式時,由於某種原因,它再次在自定義視圖上運行構造函數,我不知道爲什麼會這樣,自定義視圖的代碼在下面,任何人都可以解釋爲什麼構造函數是設備睡眠時再次運行?而且,如果我在處理Bitmaps時出現了一些明顯的錯誤,那就好了,因爲我知道我在某處出錯了。非常感謝......OutOfMemoryError在Android中使用自定義視圖並且設備進入睡眠模式時出現Java錯誤

public class LogoView extends View { 

private static final int[] FRAMES_FILE_NAMES = { R.drawable.logo0000, 
     R.drawable.logo0001, R.drawable.logo0002, R.drawable.logo0003, 
     R.drawable.logo0004, R.drawable.logo0005, R.drawable.logo0006, 
     R.drawable.logo0007, R.drawable.logo0008, R.drawable.logo0009, 
     R.drawable.logo0010, R.drawable.logo0011 }; 

private Bitmap[] mBitmapFrames; 

private Context mContext; 

private int mHeight; 
private int mWidth; 
private int mLeftPadding; 

private float mScale; 

private boolean mResourcesLoaded = false; 

public LogoView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mContext = context; 
    mBitmapFrames = new Bitmap[FRAMES_FILE_NAMES.length]; 


} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if (!mResourcesLoaded || mBitmapFrames[0].isRecycled()) { 

     mHeight = this.getHeight(); 
     Bitmap preProc = ((BitmapDrawable) mContext.getResources().getDrawable(FRAMES_FILE_NAMES[0])).getBitmap(); 
     int preProcHeight = preProc.getHeight(); 
     int preProcWidth = preProc.getWidth(); 
     mWidth = (int) (((double) preProcWidth/(double) preProcHeight) * (double) mHeight); 
     mScale = (float) mHeight/(float) preProcHeight; 
     mLeftPadding = (int)(((double)(((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth()-(double)mWidth))/2d); 

     Matrix matrix; 
     for (int x = 0;x<FRAMES_FILE_NAMES.length;x++) { 

      preProc = ((BitmapDrawable)mContext.getResources().getDrawable(FRAMES_FILE_NAMES[x])).getBitmap(); 
      matrix = new Matrix(); 
      matrix.reset(); 
      matrix.postScale((float)mScale,(float)mScale); 
      mBitmapFrames[x] = Bitmap.createBitmap(preProc, 0, 0, preProc.getWidth(), preProc.getHeight(), matrix, false);   
     } 
     preProc.recycle(); 
     mResourcesLoaded = true; 


    } 
    canvas.drawBitmap(mBitmapFrames[0], mLeftPadding, 0, null); 

} 

}

+0

OK,不知道這是爲什麼,但本質上發生的事情是進入睡眠模式時,視圖獲取從窗口分離,然後將活動再次啓動?!?所以這就像設備進入睡眠狀態時重新啓動活動一樣......我不明白這是爲什麼。 – gunboatmedia 2012-01-04 10:34:25

回答

0

是否運行在橫向模式下的活動?我想你安裝在清單android:screenOrientation="landscape"不是?我發現,在這種情況下,當活動將支持時,她再次被重新創建爲肖像。

要阻止它,請通知Android,您將通過在清單中的Activity部分中添加以下行來處理屏幕方向文件:

android:configChanges="keyboardHidden|orientation" 

希望能解決你的問題。

乾杯;)

相關問題