Dunno如何将asynctask代码放入游戏中

时间:2014-12-21 23:46:03

标签: android multithreading android-asynctask

我做了一个简单的球和onTouchListener游戏。然而,游戏运行速度非常慢,因为它每隔50毫秒绘制一次屏幕-.-所以我试图使用AsyncTask但我不知道如何实际绘制它。 如果有人能解释写什么或写正确的代码,我将不胜感激。

这里是完整的代码:

公共类MainActivity扩展ActionBarActivity实现了View.OnTouchListener {

OurView v;
Bitmap ball;
float x,y;
Bitmap a;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    v = new OurView(this);

    ball = BitmapFactory.decodeResource(getResources(),R.drawable.blueball);
    v.setOnTouchListener(this);
    x= getWindowManager().getDefaultDisplay().getWidth() / 2;
    y = getWindowManager().getDefaultDisplay().getHeight()/2;
    setContentView(v);


}

@Override
protected void onPause() {
    super.onPause();
    v.pause();


}

@Override
protected void onResume() {
    super.onResume();
    v.resume();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    return false;
}


public class OurView extends SurfaceView implements Runnable {

    Thread tr = null;
    boolean isItOk = false;
    SurfaceHolder holder;

    public OurView(Context context) {
        super(context);
        holder = getHolder();
    }


    @Override
    public void run() {

        while(isItOk)
        {
            if(!holder.getSurface().isValid()){
                continue;
            }
            Canvas c = holder.lockCanvas();
            c.drawARGB(255,5,5,10);
            c.drawBitmap(ball,x-(ball.getWidth()/2),y-ball.getHeight()/2,null);
            holder.unlockCanvasAndPost(c);
        }

    }

    public void pause(){
        isItOk = false;

        while(true){
            try{
                tr.join();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            break;

        }
        tr = null;
    }

    public void resume(){
        isItOk = true;
        tr = new Thread(this);
        tr.start();
    }


}

}

public class Hey extends AsyncTask <Void, Void, Void> implements View.OnTouchListener

{

@Override
protected void onPreExecute() {
    super.onPreExecute();



}
@Override
protected Void doInBackground(Void... params) {


    return null;
}

@Override
protected void onPostExecute(Void result) {
    super.onPostExecute(result);

}
@Override
public boolean onTouch(View v, MotionEvent event) {
    try {
        Thread.sleep(50);
    }
    catch (InterruptedException e) {
        e.printStackTrace();
    }
    switch(event.getAction()){
        case MotionEvent.ACTION_DOWN:
            ball.x= event.getX();
            ball.y = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            ball.x = event.getX();
            ball.y = event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            ball.x = event.getX();
            ball.y = event.getY();
            break;
    }
    return true;
}

1 个答案:

答案 0 :(得分:0)

哇,这完全是对AsyncTask的滥用。并非AsyncTask中的每个函数都在另一个线程上运行 - 只有doInBackground才能运行。所以在你的onTouch功能中,你在每次触摸,向上和移动时都会在主线程中睡50ms。是的,你的代码将像狗屎一样运行。如果要对绘图进行速率限制,则需要在曲面支架的线程的运行循环中进行,而不是在处理输入时。