2017-06-14 144 views
-3

我对android应用程序开发有点新,所以原谅我的菜鸟代码。我正在尝试基于运动来编写游戏。当您旋转手机时,它将屏幕上的一个物体(一个桶)从右向左滑动以捕捉掉落的物体。我在这个类中有一个主要活动和一个私人SurfaceView。我也有一个自定义线程在其中运行。我不知道为什么我的位图为空。它应该在其他地方初始化吗?

这是错误: 致命异常:主 工艺:course.examples.databaseanimation,PID:17583 显示java.lang.NullPointerException:尝试调用虚拟方法 '诠释android.graphics.Bitmap.getWidth()'在空对象引用 at android.graphics.Bitmap.createBitmap(Bitmap.java:659) at course.examples.databaseanimation.BucketThread。(BucketThread.java:25) at course.examples.databaseanimation.MainActivity $ BucketView。 surfaceCreated(MainActivity.java:102) at android.view.SurfaceView.updateWindow(SurfaceView.java:582) 在android.view.SurfaceView $ 3.onPreDraw(SurfaceView.java:177) 在android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) 在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119) at android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6060) at android.view.Choreographer $ CallbackRecord.run(Choreographer.java:858 ) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) 在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:746) at android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5443) at java.lang.reflect.Method.invoke(Native Method) at com。 android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:728) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

这是我的主题:

public class BucketThread extends Thread { 

private SurfaceHolder holder; 
private boolean running = true; 
private float shiftY; 
private float vy; 
private float x; 
private Bitmap mBucket = Bitmap.createBitmap(BitmapFactory.decodeResource 
     (Resources.getSystem(), R.mipmap.ic_launcher)); 

public BucketThread(SurfaceHolder holder){ 
    this.holder = holder; 
    x = 0; 

    } 

public void run(){ 
    while(running){ 
     Canvas canvas = null; 

     try{ 
      canvas = holder.lockCanvas(); 
      synchronized (holder){ 
       //update 
       vy += shiftY * 0.1; 
       x += vy; 

       //draw 

       Paint mPaint = new Paint(); 
       canvas.drawBitmap(mBucket, x, 0, mPaint); 
      } 

     } 
     finally { 
      if(canvas != null){ 
       holder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

public void setRunning(boolean r){ 
    running = r; 
} 

public void setShift(float shiftY){ 
    this.shiftY = shiftY; 
} 

}

这是我的主要活动:

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    RelativeLayout mainFrame = (RelativeLayout) findViewById 
      (R.id.main_frame); 
    BucketView bv = new BucketView(getApplicationContext()); 
    mainFrame.addView(bv); 

} 

private class BucketView extends SurfaceView implements SurfaceHolder.Callback, 
     SensorEventListener { 

    //private final Bitmap mBucket; 
    //private DisplayMetrics mDisplay; 
    private SurfaceHolder mSurfaceHolder; 
    private BucketThread mBuckThread; 
    //private int mDisplayWidth; 
    //private float mY; 


    public BucketView(Context context) { 
     super(context); 

     mSurfaceHolder = getHolder(); 
     mSurfaceHolder.addCallback(this); 

     SensorManager manager = (SensorManager) context.getSystemService 
       (Context.SENSOR_SERVICE); 
     if (manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() != 0) { 
      Sensor accelerometer = manager.getSensorList(Sensor 
        .TYPE_ACCELEROMETER).get(0); 
      manager.registerListener(this, accelerometer, SensorManager 
        .SENSOR_DELAY_GAME); 
     } 


    } 


    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if (mBuckThread != null) { 
      mBuckThread.setShift(event.values[1]); 
      Log.i("Main Activity", getClass().getSimpleName() + "onSensorChanged"); 
     } 

    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     mBuckThread = new BucketThread(holder); 
     mBuckThread.setRunning(true); 
     mBuckThread.start(); 
    } 


    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
           int height) { 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     boolean retry = true; 

     mBuckThread.setRunning(false); 
     while (retry) { 
      try { 
       mBuckThread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
      } 
     } 
    } 
} 

}

+0

可能重复[什么是NullPointerException,以及如何解决它?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-doi-i-fix -it) – Daniele

回答

0

变化

private Bitmap mBucket = Bitmap.createBitmap(BitmapFactory.decodeResource (Resources.getSystem(), R.mipmap.ic_launcher));

private Bitmap mBucket = Bitmap.createBitmap(BitmapFactory.decodeResource (getResources(), R.mipmap.ic_launcher));

Resources.getSystem() 不会工作,因为它是用来访问系统资源没有应用程序的资源。 所以用getResources()代替。

+0

非常感谢您的及时回复。我没有这样做,因为它告诉我getResources()不能作为方法解析。这可能是因为它在一个线程不是活动? – fran

+0

在像getApplicationContext()这样的上下文中调用它getResources() – Adithya

相关问题