안드로이드 개발 질문/답변
(글 수 45,052)
public class SurView extends SurfaceView implements SurfaceHolder.Callback{
// cache bitmap
Context mContext;
SurfaceHolder mHolder;
abThread mThread;
//-------------------------------------
// 생성자
//-------------------------------------
public SurView(Context context, AttributeSet attrs) {
super(context, attrs);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
mHolder = holder; // 생성한 holder를 전역변수에 저장
mContext = context; // 인수로 넘어 온 context를 전역변수에 저장
mThread = new abThread(); // GameThread 생성
}
//-------------------------------------
// SurfaceView가 만들어질 때 호출됨
//-------------------------------------
public void surfaceCreated(SurfaceHolder holder) {
mThread.start(); // Thread 시작
}
//-------------------------------------
// SurfaceView의 크기가 바뀔 때 호출됨
//-------------------------------------
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
//-------------------------------------
// SurfaceView가 종료될 때 호출됨
//-------------------------------------
public void surfaceDestroyed(SurfaceHolder holder) {
}
//-------------------- 여기서 부터는 스레드 영역 ----------------------------
class abThread extends Thread {
Bitmap imgBack;
//-------------------------------------
// Thread Constructor
//-------------------------------------
public GameThread() {
Display display = ((WindowManager) mContext.getSystemService(mContext.WINDOW_SERVICE))
.getDefaultDisplay();
int width = display.getWidth(); // 화면의 폭
int height = display.getHeight(); // 화면의 높이
URL imUrl;
try {
imUrl = new URL("http://news.donga.com/THUMB/2012/08/22/48798587.1.thumb.jpg);
URLConnection conn = imUrl.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
imgBack = BitmapFactory.decodeStream(bis);
imgBack = Bitmap.createScaledBitmap(imgBack, width, height, true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 이미지 확대
}
//-------------------------------------
// Thread run
//-------------------------------------
public void run() {
Canvas canvas = null; // canvas를 만든다
while (true) {
canvas = mHolder.lockCanvas(); // canvas를 잠그고 버퍼 할당
try {
synchronized (mHolder) { // 동기화 유지
canvas.drawBitmap(imgBack, 0, 0, null); // 버퍼에 그리기
}
} finally {
mHolder.unlockCanvasAndPost(canvas); // canvas의 내용을 View에 전송
}
} // while
} // run
} // End of Thread
}
이미지 URL 주소를 받아와서 서피스뷰를 이용해서 뛰우우는 것입니다.
실행하면 빨간색으로 된부분에서 오류가나서 안됩니다..
뭐때문인지 알려주시면 감사하겠습니다.
로그 파일로 올렸습니다.
2012.08.22 16:21:56
drawBItmap 하기 전에 canvas가 null이 아닌지 체크하시고
imgBack가 null이 아닌지도 체크해보세요.
둘중 하나는 널일 겁니다.
2012.08.22 16:26:05
(추천:
1 / 0)
canvas = mHolder.lockCanvas();
try {
synchronized (mHolder) {
canvas.drawBitmap(imgBack, 0, 0, null);
}
} finally {
mHolder.unlockCanvasAndPost(canvas);
}위의 소스를 아래와 같이 바꿔주세요
mCanvas = mHolder.lockCanvas();
if(imgBack != null && mCanvas != null){
mCanvas.drawBitmap(imgBack,0,0,null);
}
mHolder.unlockCanvasAndPost(mCanvas);
에러로그는 아마도 NullPoint..로 추측이 되며
캔버스/이미지 모두 값이 존재 할 때에만 그려지도록 해야합니다.




무슨 오류가 나는지 Log 를 같이 올려주세요.