가입 첫글부터.. 질문이라.. 정말 죄송합니다...
많은 것을 배워서 저도 질문에 답변하는 회원이 되도록 해야겠어요 !!!
다름이 아니라 쓰레드가 종료가 안되는 것(비정상)으로 되는것 같아 질문합니다...
thread.join();을 통해서 종료하는 것으로 알고 있는데.. 자꾸 종료가 되어버리네요....
원소스
package com.example.controlpannel;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.WindowManager;
public class GameView extends SurfaceView implements Callback {
private String tag;
private Context mContext;
private SurfaceHolder mHolder;
private GameThread mThread;
private int width, height, cx, cy;
private int x1, y1, x2, y2;
private int sx1, sy1, sx2, sy2;
private Rect src, dst;
private Bitmap imgBack;
private Bitmap User;
private int w, h;
private long counter = 0;
private boolean canRun = true;
public GameView(Context context, AttributeSet attrs) {
// TODO Auto-generated constructor stub
super(context, attrs);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
mHolder = holder;
mContext = context;
mThread = new GameThread();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
mThread.start();
Log.d(tag, "THREAD START");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
boolean done = true;
while (done) {
try {
//mThread.stop();
mThread.join();
Log.d(tag, "THREAD END");
done = false;
} catch (InterruptedException e) {
//e.printStackTrace();
}
}
}
class GameThread extends Thread {
public GameThread() {
Display display = ((WindowManager) mContext
.getSystemService(mContext.WINDOW_SERVICE))
.getDefaultDisplay();
width = display.getWidth();
height = display.getHeight();
cx = width / 2;
cy = height / 2;
Resources res = mContext.getResources();
imgBack = BitmapFactory.decodeResource(res, R.drawable.map);
imgBack = Bitmap.createScaledBitmap(imgBack, width * 2, height * 2,
true);
User = BitmapFactory.decodeResource(res, R.drawable.user);
w = User.getWidth() / 2;
h = User.getHeight() / 2;
dst = new Rect(0, 0, width, height);
src = new Rect();
x1 = imgBack.getWidth() - width;
y1 = imgBack.getHeight() - height;
sx1 = -1;
sy1 = -1;
}
public void run() {
Canvas canvas = null;
while (canRun == true) {
canvas = mHolder.lockCanvas();
try {
synchronized (mHolder) {
ScrollViewport();
canvas.drawBitmap(imgBack, src, dst, null);
canvas.drawBitmap(User, cx - w, cy - h, null);
}
}
catch(NullPointerException e){
}
finally {
mHolder.unlockCanvasAndPost(canvas);
}
}
}
private void ScrollViewport() {
counter++;
if (counter % 2 == 0) {
x1 += sx1;
y1 += sy1;
if (x1 < 0)
x1 = imgBack.getWidth() - width;
if (y1 < 0)
y1 = imgBack.getHeight() - height;
src.set(x1, y1, x1 + width, y1 + height);
}
}
}
}
로그는
07-31 22:30:44.716: E/SpannableStringBuilder(24275): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
07-31 22:30:44.716: E/SpannableStringBuilder(24275): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
07-31 22:30:44.841: W/dalvikvm(24275): threadid=11: thread exiting with uncaught exception (group=0x411e0930)
07-31 22:30:44.846: E/AndroidRuntime(24275): FATAL EXCEPTION: Thread-17022
07-31 22:30:44.846: E/AndroidRuntime(24275): java.lang.IllegalArgumentException
07-31 22:30:44.846: E/AndroidRuntime(24275): at android.view.Surface.nativeUnlockCanvasAndPost(Native Method)
07-31 22:30:44.846: E/AndroidRuntime(24275): at android.view.Surface.unlockCanvasAndPost(Surface.java:466)
07-31 22:30:44.846: E/AndroidRuntime(24275): at android.view.SurfaceView$4.unlockCanvasAndPost(SurfaceView.java:851)
07-31 22:30:44.846: E/AndroidRuntime(24275): at com.example.controlpannel.GameView$GameThread.run(GameView.java:126)
이렇게 나오네요....
휴.. 뭐가 잘못인건지...어렵네요!!