App wird unerwartet beendet

  • 2 Antworten
  • Letztes Antwortdatum
L

LunkY

Neues Mitglied
4
Hallo zusammen,

ich bin Anfänger und habe ein Problem, bei dem ich Hilfe benötige. Ich habe den Code von diesem Tutorial übernommen um etwas zu zeichen. Verändert habe ich nur folgenden Teil, da es sonst beim Wechseln zwischen Activities zu Abbrüchen kam.

@Override
public void surfaceCreated(SurfaceHolder holder) {
if (!_thread.isAlive()) {
_thread = new UI_Thread(getHolder(), this);
_thread.setRunning(true);
_thread.start();
}
}

Beim Test im Emulator wird die App ab Android 4.0 beim Wechel zwischen den Activieties beendet. Bei früheren Versionen funtioniert alles.

Logcat sagt:
E/AndroidRuntime(669): java.lang.NullPointerException
E/AndroidRuntime(669): at com.example.grafik.Draw.onDraw(Draw.java:43)
E/AndroidRuntime(669): at com.example.grafik.UI_Thread.run(Draw.java:113)
 
dein _thread wird null sein beim ersten start, da du ihn ja erst danach erzeugst
 
Vielleicht sollte ich mal den gesamten Code posten:

Code:
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new Panel(this));
    }
 
    class Panel extends SurfaceView implements SurfaceHolder.Callback {
        private TutorialThread _thread;
        Paint paint = new Paint();
 
        public Panel(Context context) {
            super(context);
            getHolder().addCallback(this);
            _thread = new TutorialThread(getHolder(), this);
        }
 
        @Override
        public void onDraw(Canvas canvas) {
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(Color.BLUE);
            canvas.drawCircle((float)(100), (float)(300), (float)(15),paint);
        }
 
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            // TODO Auto-generated method stub
 
        }
 
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            if (!_thread.isAlive()) {
                _thread = new TutorialThread(getHolder(), this);
                _thread.setRunning(true);
                _thread.start();
            }
        }
 
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            boolean retry = true;
            _thread.setRunning(false);
            while (retry) {
                try {
                    _thread.join();
                    retry = false;
                } catch (InterruptedException e) {
                }
            }
        }
    }
 
    class TutorialThread extends Thread {
        private SurfaceHolder _surfaceHolder;
        private Panel _panel;
        private boolean _run = false;
 
        public TutorialThread(SurfaceHolder surfaceHolder, Panel panel) {
            _surfaceHolder = surfaceHolder;
            _panel = panel;
        }
 
        public void setRunning(boolean run) {
            _run = run;
        }
 
        @Override
        public void run() {
            Canvas c;
            while (_run) {
                c = null;
                try {
                    c = _surfaceHolder.lockCanvas(null);
                    synchronized (_surfaceHolder) {
                        _panel.onDraw(c);
                    }
                } finally {
                    if (c != null) {
                        _surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
       switch (item.getItemId()) {
           case R.id.menue_SecondActivity:
               Intent intent1 = new Intent(this, SecondActivity.class);
               startActivity(intent1);
               return true;
           default:
               return super.onOptionsItemSelected(item);
       }
   }
}
_thread wird also rechtzeitig erzeugt? Seltsam ist auch, dass es wie gesagt auf 1.6 bis 2.3 funktioniert und auf 4.1 nicht. Ich bekomme auch nicht immer sofort eine force close Fehlermeldung. Machmal erst wenn die zweite Activity ein paar mal geöffnet und mit der zurück-Taste geschlossen wird.
 

Ähnliche Themen

G
Antworten
0
Aufrufe
148
Gerdchen07
G
G
Antworten
1
Aufrufe
393
Gerdchen07
G
G
Antworten
13
Aufrufe
621
Gerdchen07
G
L
Antworten
3
Aufrufe
659
mips400
mips400
migi01
Antworten
26
Aufrufe
2.040
migi01
migi01
Zurück
Oben Unten