마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

timertask에 관한 질문입니다.

0 추천
package exam.cardgame;
  
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
  
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
  
public class CardGameView extends View {
Bitmap m_bgImage, m_Card_Back, m_Card_Red, m_Card_Green, m_Card_Blue, m_touch;
SoundPool m_SoundPool;
MediaPlayer m_Sound_BG;
MediaPlayer m_effect1;
MediaPlayer m_effect2;
int m_Sound_ef1;
int m_Sound_ef2;
Card m_Shuffle[][]; 
Timer mTimer;
TimerTask task;
public static final int STATE_READY = 0; 
public static final int STATE_GAME = 1; 
public static final int STATE_END =2; 
public int m_state = STATE_READY;
private Card m_selected1 = null; 
private Card m_selected2 = null; 
public CardGameView(Context context) {
super(context);
setFocusable(true);
// TODO Auto-generated constructor stub
m_bgImage = BitmapFactory.decodeResource(getResources(), R.drawable.background);
m_Card_Back = BitmapFactory.decodeResource(getResources(), R.drawable.backside);
m_Card_Red = BitmapFactory.decodeResource(getResources(), R.drawable.front_red);
m_Card_Green = BitmapFactory.decodeResource(getResources(), R.drawable.front_green);
m_Card_Blue = BitmapFactory.decodeResource(getResources(), R.drawable.front_blue);
m_touch = BitmapFactory.decodeResource(getResources(), R.drawable.touch);
m_SoundPool = new SoundPool(5, AudioManager.STREAM_MUSIC,0);
m_Sound_BG = MediaPlayer.create(context, R.raw.background);
m_effect1 = MediaPlayer.create(context, R.raw.effect1);
m_effect2 = MediaPlayer.create(context, R.raw.effect2);
m_Sound_ef1 = m_SoundPool.load(context, R.raw.effect1, 1);
m_Sound_ef2 = m_SoundPool.load(context, R.raw.effect2, 1);
m_Sound_BG.start();
m_Shuffle = new Card[3][2]; 
SetCardShuffle();
CardGameThread _thread = new CardGameThread(this);
_thread.start(); 
mTimer = new Timer();
m_Handler.sendEmptyMessage(0);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
// super.onDraw(canvas);
canvas.drawBitmap(m_bgImage, 0, 0, null);
for(int y=0;y<2;y++) {
for(int x=0;x<3;x++) {
if(m_Shuffle[x][y].m_state == Card.CARD_MATCHED 
|| m_Shuffle[x][y].m_state == Card.CARD_PLAYEROPEN
|| m_Shuffle[x][y].m_state == Card.CARD_SHOW){ 
if(m_Shuffle[x][y].m_color == Card.IMG_RED)
canvas.drawBitmap(m_Card_Red, 20+x*70, 150+y*110, null);
if(m_Shuffle[x][y].m_color == Card.IMG_GREEN)
canvas.drawBitmap(m_Card_Green, 20+x*70, 150+y*110, null);
if(m_Shuffle[x][y].m_color == Card.IMG_BLUE)
canvas.drawBitmap(m_Card_Blue, 20+x*70, 150+y*110, null);
}
else if(m_Shuffle[x][y].m_state == Card.CARD_CLOSE || m_Shuffle[x][y].m_state == Card.CARD_BEGIN){ 
canvas.drawBitmap(m_Card_Back,20+x*70, 150+y*110, null);
}
}
}
if(m_Shuffle[0][0].m_state == Card.CARD_BEGIN){
canvas.drawBitmap(m_touch, 0, 0, null);
}
}
public void startGame(){ 
m_Shuffle[0][0].m_state = Card.CARD_CLOSE;
m_Shuffle[0][1].m_state = Card.CARD_CLOSE;
m_Shuffle[1][0].m_state = Card.CARD_CLOSE;
m_Shuffle[1][1].m_state = Card.CARD_CLOSE;
m_Shuffle[2][0].m_state = Card.CARD_CLOSE;
m_Shuffle[2][1].m_state = Card.CARD_CLOSE;
invalidate();
}
public void showCard(){
m_Shuffle[0][0].m_state = Card.CARD_SHOW;
m_Shuffle[0][1].m_state = Card.CARD_SHOW;
m_Shuffle[1][0].m_state = Card.CARD_SHOW;
m_Shuffle[1][1].m_state = Card.CARD_SHOW;
m_Shuffle[2][0].m_state = Card.CARD_SHOW;
m_Shuffle[2][1].m_state = Card.CARD_SHOW;
invalidate();
}
  
TimerTask task = new TimerTask(){
public void run(){
startGame();
}
};
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if(m_state == STATE_READY){
showCard();
// mTimer.schedule(task,5000);
// mTimer.cancel();
m_state= STATE_GAME;
}
else if(m_state == STATE_GAME){ //카드 뒤집는 처리
int px = (int)event.getX();
int py = (int)event.getY();
for(int y=0;y<2;y++){
for(int x=0;x<3;x++){ //카드의 내부영역을 터치했을 때만 뒤집기 위해 정의
Rect box_card = new Rect(20+x*70, 150+y*110, 20+x*70+80, 150+y*110+115);
if(box_card.contains(px,py))
if(m_Shuffle[x][y].m_state != Card.CARD_MATCHED){ //짝이 맞춰져 열린 상태가 아니면
if(m_selected1 != null){ //첫번째 카드가 선택되어진 상태
m_selected2 = m_Shuffle[x][y];
m_selected2.m_state = Card.CARD_PLAYEROPEN; //선택된 카드를 뒤집어줌
}
else if(m_selected1 == null){ //새로운 터치 없는 경우
m_selected1 = m_Shuffle[x][y];
m_selected1.m_state = Card.CARD_PLAYEROPEN;
}
} 
}
}
}
else if(m_state == STATE_END){
}
invalidate(); 
return super.onTouchEvent(event);
}
  
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER){
m_Sound_BG.pause();
}
return super.onKeyDown(keyCode, event);
}
  
public void checkMatch(){
if(m_selected1 == null || m_selected2 == null){ 
return;
}
if(m_selected1.m_color == m_selected2.m_color){
// m_effect1.start();
m_SoundPool.play(m_Sound_ef1, 1, 1, 0, 0, 1);
m_selected1.m_state = Card.CARD_MATCHED;
m_selected2.m_state = Card.CARD_MATCHED;
m_selected1 = null;
m_selected2 = null;
}
else {
// m_effect2.start();
m_SoundPool.play(m_Sound_ef1, 1, 1, 0, 0, 1);

아래의 소스는 카드게임 소스인데 touch 클릭후 5초동안 카드 앞면이 보여지고 5초후에 카드의 뒷면이보이도록 하려고 timer를 이용하였는데 timer.schedule()에서 5초후에 카드 뒷면이 보여지도록 하려고 task에 넘겨줬는데

그 부분에서 nullpointerexception이 납니다. 참고로 스레드는 이미 사용해서 핸들러나 스레드이용말고 timer이용하려고합니다. 어떻게 수정해야 할까요?? 알려주세요ㅠㅠ
 
 
SSOsso (130 포인트) 님이 2013년 4월 18일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...