2012-05-24 12 views
6

Moja aplikacja ma ten fragment koduJak uniknąć wskaźnika pustego w View.getDrawingCache()?

mView.setDrawingCacheEnabled(true); 
mBitmap = Bitmap.createBitmap(mView.getDrawingCache()); 

Gdzie WWIDOK jest instancją niestandardowej podklasy FrameLayout. Aplikacja działa dobrze przez 6 miesięcy dzięki tysiącom użytkowników. Ostatnio dostałem kilka raportów (prawdopodobnie od tego samego użytkownika, ale nie mogę potwierdzić) o zerowym wskaźniku przekazanym do createBitmap(). Nie wiem, jakiego sprzętu lub wersji Androida używa użytkownik.

Co może spowodować, że funkcja getDrawingCache() zwróci wartość null, mimo że włączyłem pamięć podręczną tuż przed nim? Czy jest to związane z akceleracją sprzętową w nowych telefonach? Czy to z powodu niewystarczającej pamięci RAM mapy bitowej? Coś jeszcze? Czy można temu zapobiec?

Edytuj: Znalazłem to rozwiązanie tutaj http://tinyurl.com/7yranvj. Czy jest to rozsądne obejście?

mBitmap = Bitmap.createBitmap(mView.getWidth(), mView.getHeight(), 
     Bitmap.Config.ARGB_8888); 
final Canvas canvas = new Canvas(mBitMap); 
mView.draw(canvas); 

Odpowiedz

0

W rzeczywistości twoje przypuszczenie było słuszne. Jeśli używana jest warstwa przyspieszana sprzętowo, nie można używać pamięci podręcznej rysunku. Nowe urządzenia mają domyślnie włączone przyspieszanie sprzętowe, więc może to być Twój problem. możesz wyłączyć przyspieszenie sprzętowe dla pojedynczego widoku w ten sposób.

if(android.os.Build.VERSION.SDK_INT >= 11) frame.setLayerType(LAYER_TYPE_SOFTWARE, null); 
frame.setDrawingCacheEnabled(true); 
Powiązane problemy