2011-08-01 123 views
0

我想找到一种方式,该线程可以关闭并重新启动,而不会程序崩溃。它从一个菜单中调用,一个activity将面板设置为它的内容视图,我希望当在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();你必须允许通过停止它内部的循环,使其自行停止。

检查第二个例子SurfaceView aniamtion电子:How can I use the animation framework inside the canvas?

+0

我在表面破坏方法下的这个链接中实现了代码。以前的活动不再崩溃,但重新启动线程没有影响 –

+0

例如,如果我重新启动线程,黑屏显示,而不是运动图像 –

+0

我认为这可能是因为您使用的是静态X,它积累了价值并保留了活动的破坏。尝试放置x = 0;在构造函数“公共Level1Thread(SurfaceHolder ...)” – Lumis

0

这里有一些建议(没有得到崩溃之外的任何细节):

  • 你应该Implement Runnable instead of Extend Thread
  • 你应该让线程知道它应该退出循环。
  • 您应该interrupt()线程而不是调用stop()(中断也使线程退出阻塞状态)。
  • 您应该在run方法内处理InterruptedException
  • 当你被打断时,你应该优雅地退出(即完成你正在做的和清理的任何事情)。

我敢肯定我错过了一些事情,但通常这应该让你摆脱困境。再说一遍,在不知道你遇到的特定异常的情况下,我会假设你正在调用stop,并且线程在运行时无论在什么状态下都没有正确清理,因此你会在某个点或另一个点上崩溃(取决于什么是国家损坏)。