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) {
}
}
}
}
}
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