Android - 多线程

Android - multithreading

在 android 上创建一个简单的游戏。 我必须在 canvas.

的随机位置随机绘制图片

问题在于出现和消失的图片。 每张图片应该在 5 秒内消失(在此期间移动的英雄必须抓住它们)。

我尝试在单独的线程中绘制图片,但它不起作用。

在这段代码中,我希望 tmpBitmap 在 5 秒内出现和消失。 (这段时间主线程肯定应该解决其他任务) 怎么做才正确?

public class Drawing extends View implements OnTouchListener {

    Bitmap ball;
    static Canvas myCanvas;
    static Bitmap tmpBitmap;

    public Drawing(Context context) {
        super(context);
        /// ... . .. 

        tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.strawberry);

        setOnTouchListener(this);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        myCanvas = canvas;

        // . .. . . . 

        /// Trying to run drawing in separate thread and disappear in 5 sec.

        MyThread t1 = new MyThread ();
        t1.start();

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        t1.interrupt();

        invalidate();
    }
    // ....

}


public class MyThread extends Thread {

    public void run() {

        while(!currentThread().isInterrupted()) {

            Drawing.myCanvas.drawBitmap(Drawing.tmpBitmap, 100, 100, null);

        }
    }
}

我的天哪,你到底为什么要阻塞线程 5 秒...?为什么你在 onDraw 中无效?你的游戏不会太流畅:P 你应该这样做:

long startTime;

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    myCanvas = canvas;

    // . .. . . . 

    /// Trying to run drawing in separate thread and disappear in 5 sec.

    if (System.currentTimeMillis() - startTime >= 5000) {
        // toggle your bitmap
        startTime = System.currentTimeMillis();
    {
}

或者,哪个更好,你应该使用ScheduledThreadExecutor。在您的视图构造函数中,您应该以固定速率启动此类执行程序。运行的任务应该切换标志,说明 btmap 是否应该被淹没。

boolean drawBitmap;

public Drawing(Context context) {
    super(context);
    /// ... . .. 

    tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.strawberry);

    setOnTouchListener(this);
    // run task here that will switch flag
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    myCanvas = canvas;

    // . .. . . . 

    if (drawBitmap) {
        // draw your bitmap here
    }
}