2011-06-22 74 views
2

我在Android蜂窩3.0(宏基Iconia)遇到了一個大問題。 我不使用任何openGL的看法,我只是在清單OpenGL在蜂窩硬件加速參數設置爲真的隨機崩潰

android:hardwareAccelerated="true" 

事實設定是,當我打開一個視圖與一定量的圖片,我改變一下它的內容和背景幾次在一個按鈕上,我的意圖完成,並出現以前的意圖。我認爲我很好地管理記憶。當其追加出現此消息:

06-22 10:13:53.510: ERROR/libEGL(951): call to OpenGL ES API with no current context (logged once per thread) 
06-22 10:14:03.150: ERROR/InputDispatcher(113): channel '4098b530 com.mycompany.myapp/com.mycompany.myapp.FolderActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x8 
06-22 10:14:03.150: ERROR/InputDispatcher(113): channel '4098b530 com.mycompany.myapp/com.mycompany.myapp.FolderActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 
06-22 10:14:03.150: ERROR/InputDispatcher(113): channel '409d30e0 com.mycompany.myapp/mycompany.myapp.GalleryActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x8 
06-22 10:14:03.150: ERROR/InputDispatcher(113): channel '409d30e0 com.mycompany.myapp/mycompany.myapp.GalleryActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 

當我設置此我沒有崩潰,但它是非常laggy:

android:hardwareAccelerated="false" 

回答

1

好球員,我找到了解決辦法:)我更新了我的標籤到Android 3.1,那給了我真正的錯誤,OutOfMemoryError。我在點擊按鈕時分配了我的背景。所以我現在做一個

WeakReference<BitmapDrawable> 

,而不是 BitmapDrawable 並且直到背景以及設置禁用我的按鈕(以避免在同一時間兩個大BitmapDrawable創建)。

希望它能幫助你,可憐的3.0 developpers ^^

編輯:這是我創建的緩存管理類:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.lang.ref.WeakReference; 
import java.util.WeakHashMap; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.BitmapFactory.Options; 
import android.graphics.drawable.BitmapDrawable; 

public class BitmapDrawableCache { 

    private static BitmapDrawableCache     instance = null; 
    WeakHashMap<String, WeakReference<BitmapDrawable>> cache; 

    private BitmapDrawableCache() { 
     cache = new WeakHashMap<String, WeakReference<BitmapDrawable>>(); 
    } 

    public synchronized static BitmapDrawable get(String drawablePath) { 
     if (instance == null) { 
      instance = new BitmapDrawableCache(); 
     } 

     BitmapDrawable bmd = null; 
     WeakReference<BitmapDrawable> wr0 = instance.cache.get(drawablePath); 
     if (instance.cache.get(drawablePath) != null) bmd = wr0.get(); 

     if (bmd == null) { 
      WeakReference<BitmapDrawable> wr = new WeakReference<BitmapDrawable>(new BitmapDrawable(drawablePath)); 
      instance.cache.put(drawablePath, wr); 
      bmd = wr.get(); 
     } 

     return bmd; 

    } 

    public synchronized static BitmapDrawable get(Bitmap bitmap) { 

     String drawableName = "_bitmap_" + bitmap.hashCode(); 

     if (instance == null) { 
      instance = new BitmapDrawableCache(); 
     } 

     BitmapDrawable bmd = null; 
     WeakReference<BitmapDrawable> wr0 = instance.cache.get(drawableName); 
     if (instance.cache.get(drawableName) != null) bmd = wr0.get(); 

     if (bmd == null) { 
      WeakReference<BitmapDrawable> wr = new WeakReference<BitmapDrawable>(new BitmapDrawable(bitmap)); 
      instance.cache.put(drawableName, wr); 
      bmd = wr.get(); 
     } 

     return bmd; 

    } 


    //Get BitmapDrawable in cache with options to reduce its size 
    public synchronized static BitmapDrawable get(String drawableName, Options options) { 
     if (instance == null) { 
      instance = new BitmapDrawableCache(); 
     } 

     BitmapDrawable bmd = null; 
     WeakReference<BitmapDrawable> wr0 = instance.cache.get(drawableName); 
     if (instance.cache.get(drawableName) != null) bmd = wr0.get(); 

     if (bmd == null) { 
      File f = new File(drawableName); 
      WeakReference<BitmapDrawable> wr = new WeakReference<BitmapDrawable>(new BitmapDrawable(instance.decodeFile(f, options))); 
      instance.cache.put(drawableName, wr); 
      bmd = wr.get(); 
     } 

     return bmd; 

    } 


    //decodes image and scales it to reduce memory consumption 
    private Bitmap decodeFile(File f, Options o2){ 
     try { 
      //Decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

      int scale=1; 
      //The new size we want to scale to 
      final int REQUIRED_SIZE=70; 

      //Find the correct scale value. It should be the power of 2. 
      int width_tmp=o.outWidth, height_tmp=o.outHeight; 
      while(true){ 
       if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
        break; 
       width_tmp/=2; 
       height_tmp/=2; 
       scale*=2; 
      } 

      //Decode with inSampleSize 
      // BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize=scale; 
      return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
     } catch (FileNotFoundException e) {} 
     return null; 
    } 

}