2017-06-14 146 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

相關問題