안녕하십니까 초보 개발자입니다.


다름이 아니라 현재 제가 나침반 위젯을 개발하고 있는데

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;

}

}

}