2017-06-14 2 views
-3

Ich bin ein wenig neu in Android App-Entwicklung, so verzeihen Sie meine Anfänger-Code. Ich versuche ein Spiel basierend auf Bewegung zu programmieren. Wenn Sie Ihr Telefon drehen, verschiebt es ein Objekt (einen Eimer) von rechts nach links auf dem Bildschirm, um fallende Objekte zu fangen. Ich habe eine Hauptaktivität und eine private SurfaceView innerhalb dieser Klasse. Ich habe auch einen benutzerdefinierten Thread, in dem das läuft.Ich kann nicht sagen, warum meine Bitmap null ist. Sollte es an anderer Stelle initialisiert werden?

Dies ist der Fehler: Schwerwiegende Ausnahme: main Prozess: course.examples.databaseanimation, PID: 17583 java.lang.NullPointerException: Versuch virtuelle Methode 'int android.graphics.Bitmap.getWidth()' aufzurufen auf einem Nullobjekt Referenz bei android.graphics.Bitmap.createBitmap (Bitmap.java:659) bei course.examples.databaseanimation.BucketThread. (BucketThread.java:25) bei course.examples.databaseanimation.MainActivity $ BucketView. SurfaceCreated (MainActivity.java:102) bei android.view.SurfaceView.updateWindow (SurfaceView.java:582) bei android.view.SurfaceView $ 3.onPreDraw (SurfaceView.java:177) bei android.view.ViewTreeObserver.dispatchOnPreDraw (ViewTreeObserver.java:944) bei android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2067) bei android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1119) bei android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:6060) bei android.view.Choreographer $ CallbackRecord.run (Choreographer.java:858) bei android.view.Choreographer.doCallbacks (Choreographer.java:670) bei android.view.Choreographer.doFrame (Choreographer.java:606) bei android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:844) bei android.os.Handler.handleCallback (Handler.java:746) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper.java:148) bei android.app.ActivityThread.main (ActivityThread.java:5443) bei java.lang.reflect.Method.invoke (native Methode) at com. android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:728) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)

Dies ist mein Thema:

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

}

Und das ist meine Haupttätigkeit:

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

Mögliche Duplikate von [Was ist eine NullPointerException, und wie behebe ich es?] (Https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) – Daniele

Antwort

0

ändern

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

zu

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

Resources.getSystem() wird nicht funktionieren, weil sie den Zugriff auf Systemressourcen Ressourcen nicht Anwendung verwendet wird. verwenden Sie stattdessen getResources().

+0

Vielen Dank für Ihre schnelle Antwort. Ich hatte dies nicht getan, weil es mir sagt, dass getResources() nicht als Methode aufgelöst werden kann. Könnte das sein, weil es in einem Thread keine Aktivität ist? – fran

+0

rufen Sie es im Kontext auf wie getApplicationContext(). GetResources() – Adithya

Verwandte Themen