안녕하십니까 초보 개발자입니다.
다름이 아니라 현재 제가 나침반 위젯을 개발하고 있는데
Performance 이슈가 있어 문의드립니다.
현재 제가 구현한 나침반은 센서로부터 값을 받고 그에 맞는 이미지를
띄우는 방식으로 구현했습니다. 그리고 그에 따른 이미지는 하기와 같이 구했습니다.
1. Bitmap 객체를 생성
2. Canvas 객체를 생성 후 Bitmap과 연결
3. Drawable을 통해 불러온 이미지를 Canvas에 그려줌
4. 그려진 이미지를 Bitmap에 옮김
5. Bitmap을 RemoteViews를 통해 ImageView로 옮겨줌
아무래도 위젯으로 실시간 업데이트(0.1초 주기)를 실시하려다보니
그에 맞는 이미지를 실시간으로 생성하기 위해 위의 방법으로 이미지를 구해 remoteview로 보냈습니다.
우선 실행을 해보니 위젯이 돌아가는 것은 확인했습니다.
그러나 좀 지나서 멈추더군요., (Out of Memory 문제발생)
그래서 그것에 대한 해결책을 찾던 중 recycle()이란 함수를 사용해서
땜질(?)을 했는데 다행히 에러는 나지 않지만 시간이 흐를 수록 performance 측면에서 동작이
너무 좋지 않았습니다. 너무 느려지더군요,
느낌상 이전 이미지파일들이 어딘가에 남다보니 그 부분에서 신속하게 진행이 되지 못하는 그런 느낌이었습니다.
따라서 상기 문제에 대한 답변을 주실 수 있으시다면 답변 부탁드립니다.
아래는 소스 일부분 입니다.
void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
{
sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); //SensorManager 인스턴스를 가져옴
oriSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); // 방향센서
oriL = new eventListener(); //방향센서 Listener instance
sensorManager.registerListener(oriL, oriSensor, SensorManager.SENSOR_DELAY_GAME); //방향센서 Listener object 등록
RemoteViews remoteviews = new RemoteViews(context.getPackageName(), R.layout.main);
remoteviews.setImageViewResource(R.id.img, R.drawable.compass_bg);
try{
d2 = (BitmapDrawable)context.getResources().getDrawable(R.drawable.compass);
bitmap2 = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
Canvas c2 = new Canvas(bitmap2);
d2.setBounds(90,10,110,190);
if(data<0){
data = 360+data;
}
else if(data >=360){
data = data-360;
}
c2.rotate(data,100,100);
d2.draw(c2);
remoteviews.setImageViewBitmap(R.id.img2, bitmap2);
appWidgetManager.updateAppWidget(appWidgetId, remoteviews);
}
catch(Exception e){
e.printStackTrace();
}finally{
if(bitmap2 !=null){
bitmap2.recycle();
bitmap2=null;
}
}
}




전 리소스는 읽어 놓고 버퍼로 사용될 비트멥 생성해 놓고 업데이트 될 때마다
버퍼 비트멥에 그리고 setImageViewBitmap으로 갱신했더니 메모리 문제는 없었습니다.
그냥 처음에 읽어 놓고 갱신하는 방향으로 하시는 것이 좋을 것 같습니다.
참고로 동서남북 나침반 위젯 입니다.
시간이 오래 지나면 서비스가 죽는가 뭔가 문제가 있는데 걍 두고 있긴 한데
동작은 처음에 리소스 읽을때 로딩 있고 나서는 정상적입니다.
메모리 문제 없구요.
참고가 되시면 좋겠네요.