2016-04-04 6 views
0

以下のコードを実行すると、すべて正常に動作します。以前のアクティビティ(エミュレータを使用して)に戻りたいときは、黒い画面が表示されてから、アプリケーションがシャットダウンします。私はまた、私がアプリケーションを終了し、それを再開しようとすると黒い画面が表示されます。私のアプリを掛けずに戻って再開するには?

コード:

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

私は私が得るかが言って約13のメッセージ「すべてのスレッドを中断ました:Xミリ秒」で、ログにエラーメッセージが表示されますいけない、それはとは何かを持っているので、私のgameloopスレッド私は思います。残念ながら、私のコードに何が問題なのかわかりません...

+0

誰でもこの問題を解決できますか? – Taegos

+0

まず、 'InterruptedException'を捕まえたときに' pause'でスタックトレースを出力します。ただそれをキャッチして何もしません。それは危険だ。第2に、一時停止すると、 'gameloop'を待ちますが、' onResume'では、待機しているスレッドを処理せずに新しい 'スレッド 'を作成します。だから私は一時停止と再開の時々の後に、あなたは待っている周りにぶら下がっているスレッドがたくさんあると思います。 –

答えて

1

、getApplicationContext()またはActivity.thisを使用しています。

onCreate()は呼び出されず、onResume()だけが呼び出されるので、次の行をそこに移動すると役立ちます。 drawView =新しいDrawView(this); setContentView(drawView);

  • なぜ内部クラスを使用するのですか?アクティビティはすでにクラスです。コードを複数回使用する場合は、それを独自のクラスにします。
1

これは私が戻って移動するために使用するものです。たぶん、これはあなたのために便利です2!

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

onBackPressed()は、最後のページに戻る場合に呼び出すことができるメソッドです。それは私のためにどのように見えるか

:あなたはコンテキストを必要とする場合

Backbutton

+0

ありがとうございました。私の他のすべてのプロジェクトでは、私はなぜ私は今それが必要になるか分からないので、私は戻ってナビゲートするための追加のコードを書く必要はありません。とにかく、私はあなたの解決策を試してみます。 – Taegos

+0

@Taegos私はそれが動作することを願って、私はアンドロイドには比較的新しいので、それはすべてのアンドロイドバージョンで動作するかわかりません。 – Robbert

+0

@Taegos私の殻が助けてくれましたか? – Robbert

関連する問題