2017-06-14 3 views
-3

Je suis un peu nouveau pour le développement d'applications Android, alors pardonnez mon code recrue. J'essaie de programmer un jeu basé sur le mouvement. Lorsque vous faites pivoter votre téléphone, il glisse un objet (un seau) de droite à gauche sur l'écran pour intercepter les objets qui tombent. J'ai une activité principale et un SurfaceView privé dans cette classe. J'ai aussi un thread personnalisé dans lequel cela fonctionne.Je ne peux pas dire pourquoi mon bitmap est nul. Devrait-il être initialisé ailleurs?

Ceci est l'erreur: EXCEPTION FATAL: principal processus: course.examples.databaseanimation, PID: 17583 java.lang.NullPointerException: tentative d'invoquer la méthode virtuelle 'int android.graphics.Bitmap.getWidth()' sur une référence d'objet null at android.graphics.Bitmap.createBitmap (Bitmap.java:659) à course.examples.databaseanimation.BucketThread. (BucketThread.java:25) à course.examples.databaseanimation.MainActivity $ BucketView. surfaceCreated (MainActivity.java:102) à 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) à android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1119) à android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:6060) à android.view.Choreographer $ CallbackRecord.run (Choreographer.java:858) à android.view.Choreographer.doCallbacks (Choreographer.java:670) à android.view.Choreographer.doFrame (Choreographer.java:606) à android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:844) à android.os.Handler.handleCallback (Handler.java:746) à android.os.Handler.dispatchMessage (Handler.java:95) à android.os.Looper.loop (Looper.java:148) à android.app.ActivityThread.main (ActivityThread.java:5443) à java.lang.reflect.Method.invoke (méthode native) à com. android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:728) à com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)

Ceci est mon fil:

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

}

Et ceci est mon activité principale:

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

Copie possible de [Qu'est-ce qu'une exception NullPointerException, et comment la réparer?] (Https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) – Daniele

Répondre

0

changement

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() ne fonctionnera pas parce qu'il est utilisé pour accéder aux ressources système non les ressources de l'application. alors utilisez plutôt getResources().

+0

merci beaucoup pour votre réponse rapide. Je n'avais pas fait cela parce qu'il me dit que getResources() ne peut pas être résolu en tant que méthode. Est-ce que cela pourrait être parce que c'est dans une discussion pas une activité? – fran

+0

appelez-le sur le contexte comme getApplicationContext(). GetResources() – Adithya