public class MLTestActivity extends Activity {
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
@Override
public void onResume(){
super.onResume();
}
//视图内部类
class MyView extends SurfaceView implements SurfaceHolder.Callback
{
private final SurfaceHolder holder;
private final MyThread myThread;
public MyView(final Context context) {
super(context);
// TODO Auto-generated constructor stub
holder = this.getHolder();
holder.addCallback(this);
myThread = new MyThread(holder);//创建一个绘图线程
}
@Override
public void surfaceChanged(final SurfaceHolder holder, final int format, final int width,
final int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(final SurfaceHolder holder) {
// TODO Auto-generated method stub
myThread.isRun = true;
myThread.start();
}
@Override
public void surfaceDestroyed(final SurfaceHolder holder) {
// TODO Auto-generated method stub
myThread.isRun = false;
}
}
class MyThread extends Thread{
private SurfaceHolder holder;
public boolean isRun ;
float radius = 10f;
Paint p;
public MyThread(SurfaceHolder holder)
{
this.holder =holder;
isRun = true;
p = new Paint();
}
public void run(){
int count = 0;
while(isRun)
{
Canvas c = null;
try{
synchronized (holder){
c = holder.lockCanvas();
c.drawColor(Color.BLACK);
//doDraw(c);
if(count % 2 == 0)
p.setColor(Color.RED);
else
p.setColor(Color.YELLOW);
Rect r = new Rect(100, 50, 300, 250);
c.drawRect(r, p);
c.drawText("这是第"+(count++)+"秒", 100, 310, p);
Thread.sleep(1000);
Thread.sleep(5);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(c!= null)
holder.unlockCanvasAndPost(c);
}
}
}
public void doDraw(Canvas c){
//这个很重要,清屏操作,清楚掉上次绘制的残留图像
c.drawColor(Color.BLUE);
p.setColor(Color.YELLOW);
c.translate(200, 200);
c.drawCircle(0,0, radius++, p );
if(radius > 100){
radius = 10f;
}
}
}
}
即使在代码里设置了isRun flag,在按下home键再回到surfaceview后,还是会报同样的错误
W/dalvikvm( 2802): threadid=1: thread exiting with uncaught exception (group=0x40a3b1f8)
E/AndroidRuntime( 2802): FATAL EXCEPTION: main
E/AndroidRuntime( 2802): java.lang.IllegalThreadStateException: Thread already started.
E/AndroidRuntime( 2802): at java.lang.Thread.start(Thread.java:1045)
E/AndroidRuntime( 2802): at andr.google.test.MLTestActivity$MyView.surfaceCreated(MLTestActivity.java:44)
E/AndroidRuntime( 2802): at android.view.SurfaceView.updateWindow(SurfaceView.java:533)
E/AndroidRuntime( 2802): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:226)
E/AndroidRuntime( 2802): at android.view.View.dispatchWindowVisibilityChanged(View.java:5844)
E/AndroidRuntime( 2802): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
E/AndroidRuntime( 2802): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
E/AndroidRuntime( 2802): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
E/AndroidRuntime( 2802): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:965)
E/AndroidRuntime( 2802): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
E/AndroidRuntime( 2802): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2802): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 2802): at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime( 2802): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2802): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 2802): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
E/AndroidRuntime( 2802): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:552)
E/AndroidRuntime( 2802): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager( 190): Force finishing activity andr.google.test/.MLTestActivity
解决办法
在onResume中调用setContentView( view ),SurfaceView会调用surfaceChanged->surfaceCreated方法
具体见http://blog.youkuaiyun.com/pengjianbosoft/article/details/7171276