Использование класса Timer для остановки программы (Java, с использованием Motodev / Eclipse)

#java #timer

#java #таймер

Вопрос:

Я только начинаю использовать Motodev для программирования для Android с использованием Java. Я работаю над примером для начинающих — создаю простую игровую программу. В примере для начинающих предлагается рассмотреть возможность установки таймера запуска / остановки, чтобы программа завершилась через 30 секунд и сказала «game over». Затем мне нужно открыть пункт меню для новой игры или выхода. Мне очень сложно понять, как использовать класс Timer для завершения работы приложения. Кто-нибудь может мне помочь с этим?

Есть 3 класса, с которыми я работаю:

Игровой холст (суперкласс)

     package com.dotsmasher;

import java.util.Random;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class DotSmasherCanvas extends View implements OnTouchListener {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(detectHit((int)event.getX(),(int)event.getY())){
        score  = 1;
        invalidate();
        }
        return false;
        }
    int dotX, dotY, score;
    public int getDotX() {
        return dotX;
    }
    public void setDotX(int dotX) {
        this.dotX = dotX;
    }
    public int getDotY() {
        return dotY;
    }
    public void setDotY(int dotY) {
        this.dotY = dotY;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    protected void moveDot(){
        //create 2 random numbers
        //assign the new numbers to dotX, dotY
        Random generator = new Random();
        generator.setSeed(System.currentTimeMillis());
        int w = getWidth()-20;
        int h = getHeight()-40;//to avoid covering score
        float f = generator.nextFloat();
        dotX = (int)(f*w)%w;
        f = generator.nextFloat();
        dotY = (int)(f*h)%h;
        }
    protected boolean detectHit(int x, int y){
        if((x>=dotXamp;amp;x<=dotX 20)amp;amp;(y>=dotYamp;amp;y<=dotY 20)){
        //we have a hit
        return true;
        }
        return false;
        }
    protected void onDraw(Canvas canvas){
        canvas.drawColor(Color.BLACK);
        Paint dotPaint = new Paint();
        dotPaint.setColor(Color.RED);
        canvas.drawRect(dotX,dotY,dotX   20,dotY   20,dotPaint);
        canvas.drawText("Score: "   score,20,20,dotPaint);
        }
    public DotSmasherCanvas(Context context){
        super(context);
        moveDot();
        setOnTouchListener(this);
        }
}
  

КЛАСС ТАЙМЕРА

     package com.dotsmasher;

import java.util.TimerTask;
import com.dotsmasher.DotSmasherCanvas;

public class DotSmasherTimerTask extends TimerTask {
    DotSmasherCanvas canvas;
    public DotSmasherTimerTask(DotSmasherCanvas canvas){
    this.canvas = canvas;
    }
    @Override
    public void run() {
        canvas.moveDot();
        canvas.postInvalidate();
    }
}
  

ОСНОВНОЙ КЛАСС

     package com.dotsmasher;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

import java.util.Timer;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
     @Override
      public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.main);
            setTitle("DotSmasher");
            canvas = new DotSmasherCanvas(getBaseContext());
            timer = new Timer();
            task = new DotSmasherTimerTask(canvas);
            timer.schedule(task, 0, 1500);
            setContentView(canvas);
            }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.game_menu, menu);
        return true;
        }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
        case R.id.item01:
        newGame();
        return true;
        case R.id.item02:
        quit();
        return true;
        default:
        return super.onOptionsItemSelected(item);
        }
        }
    void newGame(){
        canvas.setScore(0);
        }
    void quit(){
        timer.cancel();
        task = null;
        timer = null;
        canvas = null;
        finish();
        }
    private Timer timer;
    private DotSmasherCanvas canvas;
    private DotSmasherTimerTask task;
}