2011-08-01 6 views
0

プログラムがクラッシュせずにスレッドをシャットダウンして再起動できる方法を見つけようとしています。これはメニューから呼び出され、アクティビティはパネルをコンテンツビューとして設定します。アンドロイドで戻り矢印が押されてアクティビティに戻ったときにスレッドを再開することができます一点または別:(Android/javaスレッドがクラッシュする

package SortItOut.sortitout; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class Level1Panel extends SurfaceView implements 
SurfaceHolder.Callback { 

private Level1Thread thread; 
static Bitmap background; 
static int x = 0; 

public Level1Panel(Context context) { 
super(context); 
getHolder().addCallback(this); 
background = BitmapFactory.decodeResource(getResources(), R.drawable.gamebackground); 
thread = new Level1Thread(getHolder(), this); 
setFocusable(true); 
} 


public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
} 

public void surfaceCreated(SurfaceHolder holder) { 
thread.setRunning(true); 
thread.start(); 
} 


public void surfaceDestroyed(SurfaceHolder holder) { 
thread.stop(); 
} 

public void render(Canvas canvas) 
{ 
canvas.drawBitmap(background, x, 0, null); 
x = x + 20; 
} 

} 

======スレッド=======

package SortItOut.sortitout; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.view.SurfaceHolder; 

public class Level1Thread extends Thread { 


private boolean running; 
private SurfaceHolder surfaceHolder; 
private Level1Panel gamePanel; 


public void setRunning(boolean running) { 
    this.running = running; 
} 

public Level1Thread(SurfaceHolder surfaceHolder, Level1Panel gamePanel) { 
    super(); 
    this.surfaceHolder = surfaceHolder; 
    this.gamePanel = gamePanel; 
    } 



public void run() { 
    Canvas canvas; 

    while (running) { 
    canvas = null; 

    try { 
     canvas = this.surfaceHolder.lockCanvas(); 
     synchronized (surfaceHolder) { 
     this.gamePanel.render(canvas); 

     } 
     } finally { 

    if (canvas != null) { 
     surfaceHolder.unlockCanvasAndPost(canvas); 
     } 
     } 
     } 
} 



} 
+0

何らかの例外がありますか? – Kiril

答えて

0

でクラッシュするあなたは)(thred.stop使用しないでください。あなたは許可する必要がありますその中でループを止めることによって、自分自身で停止するthred。

2番目のexamplを確認するSurfaceViewのaniamtionのE:How can I use the animation framework inside the canvas?

+0

私は、このリンクのサーフェスを破壊したメソッドでコードを実装しました。以前のアクティビティがクラッシュしなくなったが、スレッドを再起動しても効果がありません –

+0

たとえば、スレッドを再起動すると動画の代わりに黒い画面が表示されます –

+0

静的なXを使用しているため、 。 x = 0を配置してみてください。コンストラクタ "public Level1Thread(SurfaceHolder ...)" – Lumis

0

ここでは、(クラッシュの例外上の任意の詳細情報を取得せずに)いくつかの提案は以下のとおりです。

  • あなたはすべきであるImplement Runnable instead of Extend Thread
  • ループを終了する必要があることをスレッドに知らせる必要があります。
  • stop()を呼び出すのではなく、スレッドをinterrupt()にする必要があります(割り込みはスレッドをブロック状態から外します)。
  • は、runメソッド内で処理する必要があります。
  • 中断されたとき(つまり、何をしていてもクリーンアップしてしまった場合)は、正常に終了する必要があります。

私はいくつか不足していると確信していますが、一般的にこれはあなたを困らせないようにします。繰り返しますが、あなたが得ている特定の例外を知らなくても、私はあなたが停止を呼び出していると仮定し、スレッドは実行時の状態で正しくクリーンアップされないため、ある時点または別の時点でクラッシュします。国家に何が壊れているのか)。

関連する問題