android – 添加/删除RelativeLayout视图时的NullPointerException(动画)

前端之家收集整理的这篇文章主要介绍了android – 添加/删除RelativeLayout视图时的NullPointerException(动画)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
嗨,我想从下到上创建一个图像和动画,并将alpha从1.0更改为0.0.我有这个代码(我在onCreate方法调用3次来制作3个动画图像):
  1. /**
  2. * Starts to make fog
  3. */
  4. private void startFogGenerator() {
  5.  
  6. handler.postDelayed(new Runnable() {
  7. @Override
  8. public void run() {
  9.  
  10. final ImageView img = new ImageView(Activity.this);
  11.  
  12. boolean showN1 = r.nextBoolean();
  13. if (showN1) {
  14. img.setImageResource(R.drawable.nube_01);
  15. } else {
  16. img.setImageResource(R.drawable.nube_02);
  17. }
  18.  
  19. Animation animation = AnimationUtils.loadAnimation(Activity.this,R.anim.translate_and_alpha);
  20. animation.setAnimationListener(new Animation.AnimationListener() {
  21. @Override
  22. public void onAnimationStart(Animation animation) {
  23. }
  24.  
  25. @Override
  26. public void onAnimationEnd(Animation animation) {
  27.  
  28. fogLayout.removeView(img);
  29. fogLayout.invalidate();
  30. // always true? Maybe but just check for for concurrency safe.
  31. if (setFogN(false) < MAX_CLOUDS_ON_SCREEN) {
  32. startFogGenerator();
  33. }
  34.  
  35. }
  36.  
  37. @Override
  38. public void onAnimationRepeat(Animation animation) {
  39. }
  40. });
  41.  
  42.  
  43. int pxWidth = Tools.toPx(140,getResources()); // Width of layout container
  44. int paddingWidth = Tools.toPx(20,getResources());
  45. int x = r.nextInt(pxWidth - paddingWidth - paddingWidth) + paddingWidth;
  46.  
  47. int range = Tools.toPx(50,getResources());
  48.  
  49. int width;
  50. int height;
  51. if (showN1) { // nube01: 167x226
  52. width = r.nextInt(Tools.toPx(167,getResources()) - range) + range;
  53. height= r.nextInt(Tools.toPx(226,getResources()) - range) + range;
  54. } else { // nube01: 144x177
  55. width = r.nextInt(Tools.toPx(144,getResources()) - range) + range;
  56. height= r.nextInt(Tools.toPx(177,getResources()) - range) + range;
  57. }
  58.  
  59. Log.d("Animation","X: " + x + ",Width: " + width + ",Height: " + height);
  60.  
  61. //img.setPadding(x,0);
  62. RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width,height);
  63. params.leftMargin = x;
  64. fogLayout.addView(img,params);
  65. img.setBackgroundColor(Color.argb(255,r.nextInt(255),r.nextInt(255))); // just for debug
  66. img.startAnimation(animation);
  67. setFogN(true);
  68.  
  69. }
  70. },r.nextInt(2500 - 200) + 200);
  71.  
  72. }
  73. private final static int MAX_CLOUDS_ON_SCREEN = 3;
  74. private AtomicInteger currentFogs = new AtomicInteger(0);
  75. private synchronized int setFogN(boolean increment) {
  76.  
  77. int toReturn = increment ? currentFogs.incrementAndGet() : currentFogs.decrementAndGet();
  78.  
  79. Log.d("TeaAnim","ToReturn: "+ toReturn);
  80.  
  81. return toReturn;
  82.  
  83. }

工作正常但是当删除第3个视图并开始另一个时间时,它会崩溃并出现NullPointerException,可能是并发问题?我怎么解决它?

例外:

  1. ERROR/AndroidRuntime(10736): FATAL EXCEPTION: main
  2. java.lang.NullPointerException
  3. at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2796)
  4. at android.view.View.getDisplayList(View.java:12648)
  5. at android.view.View.getDisplayList(View.java:12694)
  6. at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910)
  7. at android.view.View.getDisplayList(View.java:12588)
  8. at android.view.View.getDisplayList(View.java:12694)
  9. at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910)
  10. at android.view.View.getDisplayList(View.java:12588)
  11. at android.view.View.getDisplayList(View.java:12694)
  12. at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910)
  13. at android.view.View.getDisplayList(View.java:12588)
  14. at android.view.View.getDisplayList(View.java:12694)
  15. at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910)
  16. at android.view.View.getDisplayList(View.java:12588)
  17. at android.view.View.getDisplayList(View.java:12694)
  18. at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910)
  19. at android.view.View.getDisplayList(View.java:12588)
  20. at android.view.View.getDisplayList(View.java:12694)
  21. at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1198)
  22. at android.view.ViewRootImpl.draw(ViewRootImpl.java:2173)
  23. at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2045)
  24. at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1854)
  25. at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
  26. at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
  27. at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
  28. at android.view.Choreographer.doCallbacks(Choreographer.java:562)
  29. at android.view.Choreographer.doFrame(Choreographer.java:532)
  30. at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
  31. at android.os.Handler.handleCallback(Handler.java:725)
  32. at android.os.Handler.dispatchMessage(Handler.java:92)
  33. at android.os.Looper.loop(Looper.java:137)
  34. at android.app.ActivityThread.main(ActivityThread.java:5204)
  35. at java.lang.reflect.Method.invokeNative(Native Method)
  36. at java.lang.reflect.Method.invoke(Method.java:511)
  37. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
  38. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
  39. at dalvik.system.NativeStart.main(Native Method)

笔记:
fogLayout是一个具有固定宽度和高度的RelativeLayout(以dp为单位)
Tools.toPx是一种从DP转换为PX的方法

解决方法

@H_301_17@ 解决了,只是通知我正在删除视图的处理程序:
  1. handler.post(new Runnable() {
  2. public void run() {
  3. fogLayout.removeView(img);
  4. }
  5. });

猜你在找的Android相关文章