2016-04-04 22 views
0

Wenn ich meinen Code unten ausführen, funktioniert alles gut. Wenn ich zur vorherigen Aktivität zurückkehren möchte (mit dem Emulator), bekomme ich einen schwarzen Bildschirm und dann wird die App heruntergefahren. Ich bekomme auch einen schwarzen Bildschirm, wenn ich die Anwendung verlasse und versuche, sie fortzusetzen.Wie navigiere ich zurück und setze meine App fort, ohne sie aufzuhängen?

Der Code:

package com.example.bono.as3; 

import android.app.Activity; 
import android.content.Context; 
import android.content.res.AssetManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import java.io.IOException; 
import java.io.InputStream; 

public class Main extends Activity { 

    DrawView drawView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     drawView = new DrawView(this); 
     setContentView(drawView); 
    } 

    @Override public void onResume(){ 
     super.onResume(); 
     drawView.resume(); 
    } 

    @Override public void onPause(){ 
     super.onPause(); 
     drawView.pause(); 
    } 

    public class DrawView extends SurfaceView implements Runnable{ 

     Thread gameloop = new Thread(); 
     SurfaceHolder surface; 
     volatile boolean running = false; 
     AssetManager assets = null; 
     BitmapFactory.Options options = null; 
     Bitmap incect[]; 
     int frame = 0; 

     public DrawView(Context context){ 
      super(context); 
      surface = getHolder(); 
      assets = context.getAssets(); 
      options = new BitmapFactory.Options(); 
      options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

      incect = new Bitmap[2]; 

      try { 
       for (int n = 0; n < incect.length; n++){ 
        String filename = "incect"+Integer.toString(n+1)+".png"; 
        InputStream istream = assets.open(filename); 
        incect[n] = BitmapFactory.decodeStream(istream,null,options); 
        istream.close(); 
       } 
      } catch (IOException e){ 
       e.printStackTrace(); 
      } 
     } 

     public void resume(){ 
      running = true; 
      gameloop = new Thread(this); 
      gameloop.start(); 
     } 

     public void pause(){ 
      running = false; 
      while (true){ 
       try { 
        gameloop.join(); 
       } 
       catch (InterruptedException e){} 
      } 
     } 

     @Override public void run(){ 
      while (running){ 
       if (!surface.getSurface().isValid()) 
        continue; 
       Canvas canvas = surface.lockCanvas(); 
       canvas.drawColor(Color.rgb(85, 107, 47)); 
       canvas.drawBitmap(incect[frame], 0, 0, null); 

       surface.unlockCanvasAndPost(canvas); 

       frame++; 

       if (frame > 1) frame = 0; 

       try { 
        Thread.sleep(500); 
       } catch (InterruptedException e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

ich nicht jede Fehlermeldung im Protokoll bekommen, was ich tue, ist etwa 13 Nachrichten sagen „nahm alle Themen Aussetzung: X ms“, so dass es etwas mit dem zu tun hat meine Gameloop Thread denke ich. Leider sehe ich nicht, was das Problem in meinem Code ist ...

+0

kann mir jemand mit diesem Problem helfen? – Taegos

+0

Erstens, in "Pause", wenn Sie "InterruptedException" fangen, Print-Stack-Ablaufverfolgung, nicht nur fangen und nichts tun. Es ist gefährlich. Zweitens, wenn Sie pausieren, lassen Sie die 'gameloop' warten, aber' onResume', erstellen Sie einen anderen neuen 'thread', ohne den Faden zu behandeln, den Sie anhängen. Ich denke mal nach Pause und Wiederaufnahme hätte man viel Faden warten müssen. –

Antwort

1

Wenn Sie einen Kontext benötigen, verwenden getApplicationContext() oder activity.This. (scheint weniger Buggy mit meinem Code)

Während zurück zu einer zuvor verwendeten Aktivität, onCreate() wird nicht aufgerufen, nur onResume(), so könnte es hilfreich sein, wenn Sie die folgenden Zeilen dorthin verschieben. drawView = neue DrawView (this); setContentView (drawView);

  • Warum innere Klasse überhaupt verwenden? Aktivität ist bereits eine Klasse. Wenn Sie den Code mehrmals verwenden möchten, machen Sie ihn selbst zu einer Klasse.
1

Das ist, was ich benutze, um zurück zu navigieren. Vielleicht ist das nützlich für Sie 2!

Button backpressed = (Button) findViewById(R.id.btBack); 
    backpressed.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      onBackPressed(); 
     } 
    }); 

Die onBackPressed() ist nur eine Methode, die Sie aufrufen können, wenn Sie zur letzten Seite zurückkehren wollen.

, wie es für mich aussieht:

Backbutton

+0

Danke für die Antwort. Auf all meinen anderen Projekten muss ich keinen zusätzlichen Code schreiben, um zurück zu navigieren, also verstehe ich nicht, warum ich es jetzt brauchen würde. Wie auch immer, ich werde deine Lösung ausprobieren. – Taegos

+0

@Taegos Ich hoffe, es funktioniert, ich bin relativ neu in Android, so weiß ich nicht, ob es in jeder Android-Version funktioniert. – Robbert

+0

@Taegos Hat Ihnen mein Ahnentäter geholfen? – Robbert