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

SurfaceView에 복수 스레드 만드는것과 터치시 스레드의 호출

0 추천

기본 SurfaceView에 스레드1를 놓고 스레드1에는 배경같은 움직이지 않는 고정 이미지를 배치하고, 화면을 처리하면 스레드2를 불러서 스레드2에서는 sleep으로 시간을 조정해서 빠르게 움직이는 이미지를 표시하려고 합니다. 

Surfaceview에 holder랑 이용해서 스레드1에 이미지를 표시하는건 잘 되는데...surfaceview안에 스레드를 하나 더 만들고 그걸 부르는게 안됩니다...터치다운 이벤트에서 스레드2를 start걸면 에러나면서 튕겨버립니다 ㅠ.ㅠ...

public class MainActivity extends Activity {
 
GameThread2 gamethread2;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
setContentView(new MyGameView(this));
 
}
 
public class MyGameView extends SurfaceView implements Callback {
GameThread mThread;
SurfaceHolder  mHolder;
 
Bitmap topgaugebar, touchzone, gauge ,mapView, caracterView, monsterView ;
Bitmap effect_roundboom[] = new Bitmap[6];
 
public MyGameView(Context context) {
super(context);
 
SurfaceHolder holder = getHolder();
        holder.addCallback(this);
        mThread = new GameThread(context, holder); 
        gamethread2 = new GameThread2(); 
        
}
 
public void surfaceCreated(SurfaceHolder arg0) {
mThread.start();
 
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
 
}
 
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
 
}
 
    class GameThread extends Thread {
         //--------------------------------------
         //    Thread Constructor
         //--------------------------------------
         public GameThread(Context context, SurfaceHolder holder) {
              mHolder = holder;
 
              topgaugebar = Bitmap.createScaledBitmap(topgaugebar, S_TopGbarX, S_TopGbarY, true);
              mapView =  Bitmap.createScaledBitmap(mapView, S_MapX, S_MapY, true);
         }
 
         public void run() {     
                   Canvas canvas = null;
                   canvas = mHolder.lockCanvas();
                   try {
                        synchronized (mHolder) {          
                             canvas.drawBitmap(topgaugebar, 0, 0, null);          
                             canvas.drawBitmap(mapView, 0, S_TopGbarY, null);
                        }
                   }
                   catch(Exception ee){}
                   finally {
                         mHolder.unlockCanvasAndPost(canvas);
                   }
         } // run()
 
    } // Thread 끝
    class GameThread2 extends Thread {
        public GameThread2() {
        }
 
        public void run() {     
  
        } // run()
 
   } // Thread 끝
 
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// gamethread2 = new GameThread2(); 
gamethread2.start();
 
 
}
return true;
}
}
소스는 선언하는부분이나 기타 이미지 표시에 관련된부분은 거의 다 지우고 보기쉽게 구조만 남겨놨습니다.
GameThread는 맨 처음 어플 기동하면 잘 움직입니다...헌데 터치리스너에서 gamethread2.start();를하면 에러가 납니다...그리고 여기서 에러가나서 계속 확인을 못하고있는데...
SurfaceView에서 선언하고 초기화한 holder같은건 스레드마다 따로만들 필요 없이 하나만 만들어서 다 같이 쓰면 되는건가요? 4일째 헤매다가 질문드립니다 ㅠ.ㅠ...질문내용에 부족한부분이나 부가설명같은게 필요하시면 알려주세요 최대한 자세히 추가하겠습니다. 도움좀 주시면 감사하겠습니다 ㅠ
gs낭천 (340 포인트) 님이 2014년 6월 24일 질문

1개의 답변

0 추천
lockCanvas 때문인 것 같네요.

정확한 것은 로그를 봐야 알 수 있어요.
익명사용자 님이 2014년 6월 25일 답변
...