在大部分安卓手機(jī)上運(yùn)行正常,但是在部分Android 4.0.x系統(tǒng)中(例如Nexus S Android 4.0.3模擬器),如果連續(xù)同時(shí)執(zhí)行多個(gè)動(dòng)畫,可能會(huì)出現(xiàn)NullPointerException,如下:
com.jzj1993.anim E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2488)
at android.view.View.draw(View.java:10981)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2126)
? ? ? ? ? ? at android.view.ViewRootImpl.draw(ViewRootImpl.java:2026)
? ? ? ? ? ? at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
? ? ? ? ? ? at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
? ? ? ? ? ? at android.os.Handler.dispatchMessage(Handler.java:99)
? ? ? ? ? ? at android.os.Looper.loop(Looper.java:137)
? ? ? ? ? ? at android.app.ActivityThread.main(ActivityThread.java:4424)
? ? ? ? ? ? at java.lang.reflect.Method.invokeNative(NativeMethod)
? ? ? ? ? ? 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(NativeMethod)
解決方法
將以下代碼
@Override
publicvoid onAnimationEnd(Animation animation){
container.removeView(tempLayout);
}
改為:
@Override
publicvoid onAnimationEnd(Animation animation){
container.post(newRunnable(){
@Override
publicvoid run(){
container.removeView(tempLayout);
}
});
}
原因分析
以下是官方給出的ViewGroup.removeView方法的JavaDoc注釋:
publicvoid removeView (View view)
Addedin API level 1
Note:donot invoke this method from draw(android.graphics.Canvas), onDraw(android.graphics.Canvas), dispatchDraw(android.graphics.Canvas)or any related method.