2012-10-11 24 views
11

Dostałem kilka komunikatów o błędach z mojej aplikacji za pomocą jednego kliknięcia przycisku. Po kliknięciu animacja powinna się rozpocząć, ale przycisk staje się większy. Działa doskonale na większości urządzeń, ale na niektórych (myślę, że głównie 4.X i wyżej) ulega awarii.NullPointerException z włączoną obsługą Hardwareacceleration?

wiadomość Exception (Stos nazwiska):

java.lang.NullPointerException 
at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:118) 
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:400) 
at android.view.View.draw(View.java:10999) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3186) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3184) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3184) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3184) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) 
at android.view.View.draw(View.java:11017) 
at android.view.View.getDisplayList(View.java:10444) 
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2896) 
at android.view.View.getDisplayList(View.java:10407) 
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2896) 
at android.view.View.getDisplayList(View.java:10407) 
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2896) 
at android.view.View.getDisplayList(View.java:10407) 
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:883) 
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2089) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1781) 
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2666) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:156) 
at android.app.ActivityThread.main(ActivityThread.java:4977) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 

Z góry dzięki!

Odpowiedz

2

Szukałem odpowiedzi na to od kilku ostatnich dni. Jest to udokumentowane w ICS, ale zauważyłem to w jednym z testowych telefonów Samsung Galaxy S3 z 4.1.2. Większość osób sugeruje wyłączanie przyspieszania sprzętowego; Nie chciałem tego robić, ponieważ akceleracja sprzętowa sprawia, że ​​moje animacje są tak jedwabiście gładkie. Odkryłem więc, że jeśli przesłonię draw() spróbuję i pochwycę wyjątek wskaźnika pustego, to sprzętowe akcelerowane funkcje działają (przez większość czasu) i wystarczą, aby nigdy nie zauważyć, że nie działają lub wyrzucają wyjątek.

@Override 
public void draw(Canvas canvas) { 
    try{ 
     super.draw(canvas); 
    }catch(java.lang.NullPointerException e){ 
     //you can log if you want to you can leave your friends behind 
     //Log.e("mytag","MyCustomView::draw():"+e); 
    } 
} 
+1

Wzniesiono z uwagi na zwięzłość. Metoda 'draw' nie uruchamia żadnego kodu aplikacji, więc jeśli twoja logika aplikacji zgłasza wszelkie wyjątki wskaźnika pustego, zostaną one przechwycone gdzie indziej (powiedzmy o zdarzeniu, itp.), Ale na pewno nie podczas rysowania. Jest niewiele rzeczy, które twoja aplikacja robi, gdy pojawia się przerysowanie. Sądzę, że ta metoda jest bezpieczna dla twojej aplikacji. Ale nie wiem, czy to bezpieczne dla urządzenia. – Subhas

0

Widziałem ten sam błąd i to jest dziwne, ale dzieje się tylko w bardzo konkretnym scenariuszu.

Opiszę to tutaj, na wypadek gdyby pomógł komukolwiek.

Pojawia się, gdy uruchomię animację skali, która wynosi 0% w widoku (zasadniczo zmniejsza się do połowy ekranu) na urządzeniu ICS z włączonym przyspieszeniem HW.

  • W przypadku ICS przyspieszenie HW wyłączone, nie ulega awarii.
  • W przypadku ICS przyspieszenie HW, inne typy animacji (rosną, tłumaczą) nie ulega awarii.
  • Na Jelly Bean (4.1, 4.3) (dowolna kombinacja innych czynników) nie ulega awarii.

Myślę, że wyłączę akcelerację HW tylko dla tego widoku i przejdę dalej, więc reszta mojej aplikacji będzie działała płynnie.

Mam nadzieję, że to pomoże.

Powiązane problemy