NullPointerException с аппаратным ускорением включен?

Я получил несколько сообщений об ошибках из своего приложения простым нажатием кнопки. После щелчка анимация должна начинаться, но кнопка становится больше. Он отлично работает на большинстве устройств, но на некоторых (я думаю, в основном 4.X и выше) он сбой.

Сообщение об исключении (Trace Stack):

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)

Спасибо заранее!

Ответ 1

Я искал ответ на этот вопрос за последние пару дней. Его документально подтвердили в ICS, но я заметил это на одном из моих тестовых телефонов Samsung Galaxy S3, работающем на 4.1.2. Большинство людей предлагают отключить аппаратное ускорение; Я не хотел этого делать, аппаратное ускорение делает мои анимации такими шелковистыми. Итак, я нашел, что если я переопределяю draw(), попробую и поймаю исключение нулевого указателя, что аппаратные ускоренные функции работают (в большинстве случаев), и достаточно, чтобы вы никогда не замечали, что они не работают или не бросают исключение.

@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);
    }
}

Ответ 2

Я видел эту ту же ошибку, и это странно, но происходит только в очень специфическом сценарии.

Я опишу его здесь, если он поможет кому-то.

Появляется, когда я запускаю анимацию масштаба, которая переходит на 0% на вид (в основном, уменьшаются до середины экрана) на устройстве ICS с включенным ускорением HW.

  • В ICS, ускорение HW выключено, оно не сработает.
  • В ICS, ускорение HW включено, другие типы анимации (расти, переводить), это не сбой.
  • На желе Bean (4.1, 4.3) (любая комбинация других факторов) он не падает.

Я думаю, что я отключу ускорение HW только для этого вида и продолжу, так что остальное приложение будет работать плавно.

Надеюсь, что это поможет.