Android 暂停SurfaceView时应用程序冻结?

Android 暂停SurfaceView时应用程序冻结?,android,multithreading,surfaceview,forceclose,onpause,Android,Multithreading,Surfaceview,Forceclose,Onpause,当我按下home键并返回时,我的应用程序一直在运行logcat不会给我任何错误,只是: D/gralloc_goldfish(1842): Emulator without GPU emulation detected. I/Choreographer(1842): Skipped 60 frames! The application may be doing too much work on its main thread. I/dalvikvm(1842): threadid=3: rea

当我按下home键并返回时,我的应用程序一直在运行logcat不会给我任何错误,只是:

D/gralloc_goldfish(1842): Emulator without GPU emulation detected.
I/Choreographer(1842): Skipped 60 frames!  The application may be doing too much work on its main thread.
I/dalvikvm(1842): threadid=3: reacting to signal 3
I/dalvikvm(1842): Wrote stack traces to '/data/anr/traces.txt'
这是一个非常演示性的应用程序,因此我将发布整个代码,因为我不在乎谁使用它:

public class MainActivity extends Activity {


dartBoard board;
EditText radius;
EditText numDarts;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    board = new dartBoard(this);
    Display mDisplay = this.getWindowManager().getDefaultDisplay();
    int width= mDisplay.getWidth();
    int Height= mDisplay.getHeight();
    LinearLayout lin = new LinearLayout(this);
    LinearLayout linMain = new LinearLayout(this);




    Button throwDart = new Button(this);
    Button setRadius = new Button(this);


    setRadius.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT);
    setRadius.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
    setRadius.setText("Set Radius");
    setRadius.setTextSize(10);

    setRadius.setOnClickListener(radiusListener);

    throwDart.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT);
    throwDart.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
    throwDart.setText("Throw Dart");
    throwDart.setTextSize(10);
    throwDart.setOnClickListener(throwListener);



    numDarts = new EditText(this);
    radius = new EditText(this);


    radius.setHint("Set Radius");
    radius.setText("3");
    radius.setInputType(InputType.TYPE_CLASS_NUMBER);
    numDarts.setText("5");
    numDarts.setHint("Num Darts?");
    numDarts.setInputType(InputType.TYPE_CLASS_NUMBER);


    android.widget.FrameLayout.LayoutParams params = new android.widget.FrameLayout.LayoutParams(width, width);
    board.setLayoutParams(params);


    lin.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT , LinearLayout.LayoutParams.WRAP_CONTENT));
    lin.setOrientation(LinearLayout.VERTICAL);

    lin.addView(board);
    linMain.addView(numDarts);
    linMain.addView(throwDart);
    linMain.addView(radius);
    linMain.addView(setRadius);

    lin.addView(linMain);

    setContentView(lin);
}
View.OnClickListener throwListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        try{
            board.throwDarts(Integer.parseInt(numDarts.getText().toString()));
        }
        catch (NumberFormatException e){
            Toast.makeText(getApplicationContext(), "Enter A number!", Toast.LENGTH_LONG).show();

        }

    }
};

View.OnClickListener radiusListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        try{
            int num = Integer.parseInt(radius.getText().toString());
            board.changeRadius(num);
        }
        catch(NumberFormatException e){
            Toast.makeText(getApplicationContext(), "Enter a Radius!", Toast.LENGTH_LONG).show();
        }

    }
}; 

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    board.pause();
}
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    board.resume();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}







public static class dartBoard extends SurfaceView implements Runnable{
    Boolean threadRunning, throwingDarts;
    SurfaceHolder holder;
    Thread t = null;
    Paint blue,red,black,white;
    int rad, numberOfDarts;
    Rect r; 
    int x[],y[];





    public dartBoard(Context context) {
    super(context);
    // TODO Auto-generated constructor stub

    threadRunning = false;
    throwingDarts = false; 

    holder = getHolder();
    blue = new Paint();
    blue.setColor(Color.BLUE);
    blue.setStyle(Style.FILL);

    red = new Paint();
    red.setColor(Color.RED);
    red.setStyle(Style.FILL);

    black = new Paint();
    black.setColor(Color.BLACK);
    black.setStyle(Style.STROKE);

    white = new Paint();
    white.setColor(Color.WHITE);
    white.setStyle(Style.FILL);

    rad = 3;

    }

    public void onDraw(Canvas canvas){
        canvas.getWidth();

        r = new Rect(0,0, canvas.getWidth(), canvas.getWidth());
        canvas.drawRect(r, blue);
        canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, rad*(canvas.getWidth()/20) , red);
        canvas.drawLine(0, canvas.getWidth()/2, canvas.getWidth(), canvas.getWidth()/2, black);
        canvas.drawLine(canvas.getWidth()/2, 0, canvas.getWidth()/2, canvas.getWidth(), black);

        if(throwingDarts){

            for(int i = 0; i < numberOfDarts; i++){
                canvas.drawCircle(x[i]*(canvas.getWidth()/20), y[i]*(canvas.getWidth()/20), (canvas.getWidth()/20), white);
                canvas.drawCircle(x[i]*(canvas.getWidth()/20), y[i]*(canvas.getWidth()/20), (canvas.getWidth()/20), black);

            }


        }

    }
    @SuppressLint("WrongCall")
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(threadRunning){
            if(!holder.getSurface().isValid()){
                continue;
            }
            Canvas c = holder.lockCanvas();
            onDraw(c);
            holder.unlockCanvasAndPost(c);
        }


    }

    public final void resume(){
        t = new Thread(this);
        t.start();
        threadRunning = true;
    }
    public final void pause(){
        while(true){
            try {
                t.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            break;
        }
        t = null;

    }

    public void changeRadius(int r){
        rad = r;
    }
    public void throwDarts(int numDarts)
    {
        numberOfDarts = numDarts;

        Random rand = new Random();

        x = new int[numDarts];
        y = new int[numDarts];
        for(int i = 0; i < numDarts; i++)
        {
            x[i] = rand.nextInt(21);
            y[i] = rand.nextInt(21);
        }
        throwingDarts = true;

    }

    public boolean hit(int x, int y)
    {
        if(Math.sqrt(x*x + y*y) <= 3)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

}
}
公共类MainActivity扩展活动{
飞镖板;
编辑文本半径;
编辑文本numDarts;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
board=新的镖靶(此);
Display mDisplay=this.getWindowManager().getDefaultDisplay();
int width=mDisplay.getWidth();
int Height=mDisplay.getHeight();
LinearLayout lin=新的LinearLayout(本);
LinearLayout linMain=新的LinearLayout(本);
按钮throwDart=新按钮(此按钮);
按钮设置半径=新按钮(此按钮);
setRadius.setWidth(LinearLayout.LayoutParams.WRAP_内容);
setRadius.setHeight(LinearLayout.LayoutParams.WRAP_内容);
setRadius.setText(“设置半径”);
setRadius.setTextSize(10);
setRadius.setOnClickListener(radiusListener);
throwDart.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT);
throwDart.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
throwDart.setText(“掷镖”);
第二部分:设置尺寸(10);
throwDart.setOnClickListener(throwlListener);
numDarts=新编辑文本(本);
半径=新编辑文本(此);
半径设置提示(“设置半径”);
半径。setText(“3”);
半径.设置输入类型(输入类型.类型\类别\编号);
numDarts.SETEXT(“5”);
setHint(“Num Darts?”);
numDarts.setInputType(InputType.TYPE\类别\编号);
android.widget.FrameLayout.LayoutParams params=新的android.widget.FrameLayout.LayoutParams(宽度,宽度);
board.setLayoutParams(参数);
lin.setLayoutParams(新的LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_父项,LinearLayout.LayoutParams.WRAP_内容));
林。设置方向(线性布局。垂直);
林·艾德维尤(董事会);
linMain.addView(numDarts);
linMain.addView(throwDart);
linMain.addView(半径);
linMain.addView(setRadius);
lin.addView(linMain);
setContentView(lin);
}
View.OnClickListener throwlListener=新建视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
试一试{
board.throwDarts(Integer.parseInt(numDarts.getText().toString());
}
捕获(数字格式){
Toast.makeText(getApplicationContext(),“输入一个数字!”,Toast.LENGTH\u LONG.show();
}
}
};
View.OnClickListener radiusListener=新视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
试一试{
int num=Integer.parseInt(radius.getText().toString());
线路板半径(num);
}
捕获(数字格式){
Toast.makeText(getApplicationContext(),“输入半径!”,Toast.LENGTH\u LONG.show();
}
}
}; 
@凌驾
受保护的void onPause(){
//TODO自动生成的方法存根
super.onPause();
暂停();
}
@凌驾
受保护的void onResume(){
//TODO自动生成的方法存根
super.onResume();
董事会。简历();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
公共静态类dartBoard扩展了SurfaceView实现Runnable{
布尔线程运行,投掷省道;
表面焊钳;
线程t=null;
涂蓝、红、黑、白;
int rad,省道数;
矩形r;
int x[],y[];
公共镖靶(上下文){
超级(上下文);
//TODO自动生成的构造函数存根
threadRunning=false;
投掷飞镖=假;
holder=getHolder();
蓝色=新油漆();
blue.setColor(Color.blue);
蓝色。设置样式(样式填充);
红色=新油漆();
红色。设置颜色(颜色。红色);
红色。设置样式(样式填充);
黑色=新油漆();
黑色。设置颜色(颜色。黑色);
黑色。设置样式(样式。笔划);
白色=新油漆();
白色。设置颜色(颜色。白色);
白色。设置样式(样式填充);
rad=3;
}
公共空白onDraw(画布){
getWidth();
r=新矩形(0,0,canvas.getWidth(),canvas.getWidth());
画布。drawRect(r,蓝色);
drawCircle(canvas.getWidth()/2,canvas.getHeight()/2,rad*(canvas.getWidth()/20),红色);
drawLine(0,canvas.getWidth()/2,canvas.getWidth(),canvas.getWidth()/2,黑色);
drawLine(canvas.getWidth()/2,0,canvas.getWidth()/2,canvas.getWidth(),黑色);
如果(投掷飞镖){
对于(int i=0;i