안녕하세요 초보개발자입니다.
다름이 아니라 현재 제가 나침반 위젯을 만들었는데요.
나침반 위젯이 평소에는 잘 동작하다가 중간에 전원을 껐다 켜면
동작이 멈추는 현상이 발생합니다.
물론 처음 몇 번은 멈추지 않는데 그 몇번이 지나면 그 이후에는 전원 on/off시
나침반 위젯이 동작을 멈추네요.
메모리 문제라 생각은 되는데 앱 위젯을 제거하지 않고 중간에 강제종료되는 상황에서의
처리가 안된게 아닐까 생각되는데 어떻게 구현을 해야될지 모르곘습니다.
고수님들의 도움을 부탁드립니다.
아래 코드와 log를 적었습니다.
확인부탁드립니다. 감사합니다.
===============================================================================
public class MainCompassAppWidgetProvider extends AppWidgetProvider {
final int UPDATE_MILLIS_INTERVAL = 100;
static PendingIntent Sender = null;
static AlarmManager Manager = null;
//static : 전 class에서 값 공유함
SensorManager SensorManager = null;
Sensor Orientation_Sensor = null;
SensorEventListener Orientation_Listener = null;
static int Orientation_EventData=0;
static BitmapDrawable DrawableImage1=null;
static BitmapDrawable DrawableImage2=null;
Bitmap Bitmap1=null;
Bitmap Bitmap2=null;
Canvas Canvas1=null;
Canvas Canvas2=null;
// int sec = 0;
// Date d = new Date(System.currentTimeMillis());
// Context context;
public void onReceive(Context context, Intent intent)
{
super.onReceive(context, intent);
String action = intent.getAction();
// 위젯 업데이트 인텐트를 수신했을 때
if(action.equals("android.appwidget.action.APPWIDGET_UPDATE"))
{
removePreviousAlarm();
setNewAlarm(context, intent);
}
// 위젯 제거 인텐트를 수신했을 때
else if(action.equals("android.appwidget.action.APPWIDGET_DISABLED"))
{
removePreviousAlarm();
}
}
@Override
public void onDisabled(Context context) {
// TODO Auto-generated method stub
super.onDisabled(context);
if(Orientation_EventData!=0){
Orientation_EventData=0;
}
if(DrawableImage1!=null){
DrawableImage1=null;
}
if(DrawableImage2!=null){
DrawableImage1=null;
}
if(SensorManager != null){
SensorManager = null;
}
if(Orientation_Sensor != null){
Orientation_Sensor = null;
}
if( Orientation_Listener != null){
Orientation_Listener = null;
}
if( Bitmap1!=null){
Bitmap1=null;
}
if( Bitmap2!=null){
Bitmap2=null;
}
if(Canvas1!=null){
Canvas1=null;
}
if(Canvas2!=null){
Canvas2=null;
}
Log.e("<---onDisabled--->","onDisabled~!!!!!!!!!");
}
@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
super.onEnabled(context);
SensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); //SensorManager 인스턴스를 가져옴
Orientation_Sensor = SensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); // 방향센서
Orientation_Listener = new eventListener(); //방향센서 Listener instance
SensorManager.registerListener(Orientation_Listener, Orientation_Sensor, SensorManager.SENSOR_DELAY_GAME); //방향센서 Listener object 등록
DrawableImage1 = (BitmapDrawable)context.getResources().getDrawable(R.drawable.img_compass_bg);
DrawableImage1.setBounds(0,0,200,200);
DrawableImage2 = (BitmapDrawable)context.getResources().getDrawable(R.drawable.img_compass_arr);
DrawableImage2.setBounds(90,10,110,190);
}
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
// 현재 클래스로 등록된 모든 위젯의 리스트를 가져옴
appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, getClass()));
super.onUpdate(context, appWidgetManager, appWidgetIds);
final int N = appWidgetIds.length;
for(int i = 0 ; i < N ; i++)
{
int appWidgetId = appWidgetIds[i];
Log.i("<---AppWidgetId--->",Integer.toString(appWidgetId));
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
//위젯의 형태를 업데이트합니다.
//@param context 컨텍스트
//@param appWidgetManager 위젯 메니저
//@param appWidgetId 업데이트할 위젯 아이디
void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
{
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.main_compass_activity);
try{
Bitmap1 = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
Canvas1 = new Canvas(Bitmap1);
DrawableImage1.draw(Canvas1);
Bitmap2 = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
Canvas2 = new Canvas(Bitmap2);
Canvas2.rotate(Orientation_EventData,100,100);
DrawableImage2.draw(Canvas2);
updateViews.setImageViewBitmap(R.id.compass_background, Bitmap1);
updateViews.setImageViewBitmap(R.id.compass_bar, Bitmap2);
appWidgetManager.updateAppWidget(appWidgetId, updateViews);
}catch(Exception e){
e.printStackTrace();
Log.e("<---error--->","Exception error is generated~!!!");
}finally{
if(Bitmap2 != null){
Bitmap2.recycle();
Log.i("Recycle()~~!!!!!","Recycle was completed~!!");
}
else if(Bitmap1 !=null){
Bitmap1.recycle();
}
}
}
class eventListener implements SensorEventListener{
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
Orientation_EventData = -(int)event.values[0];
if(Orientation_EventData<0){
Orientation_EventData = 360+Orientation_EventData;
}
else if(Orientation_EventData >=360){
Orientation_EventData = Orientation_EventData-360;
}
}
}
private void setNewAlarm(Context context, Intent intent) {
// TODO Auto-generated method stub
long firstTime = System.currentTimeMillis() + UPDATE_MILLIS_INTERVAL;
Sender = PendingIntent.getBroadcast(context, 0, intent, 0);
Manager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Manager.set(AlarmManager.RTC, firstTime, Sender);
Log.d("<---setNewAlar--->","Sender and Manager are generated~!!!!");
}
//예약되어있는 알람을 취소합니다.
public void removePreviousAlarm()
{
if(Manager != null && Sender != null)
{
Sender.cancel();
Manager.cancel(Sender);
Log.w("<---removePreviousAlarm()--->","Sender and Manager are canceled~!!!!");
}
}
}
===============================================================================
===============================================================================
06-25 22:55:29.692: E/<---error--->(4793): Exception error is generated~!!!
06-25 22:55:29.697: W/<---removePreviousAlarm()--->(4793): Sender and Manager are canceled~!!!!
06-25 22:55:29.702: D/<---setNewAlar--->(4793): Sender and Manager are generated~!!!!
06-25 22:55:29.802: I/<---AppWidgetId--->(4793): 410
06-25 22:55:29.807: W/System.err(4793): java.lang.NullPointerException
06-25 22:55:29.807: W/System.err(4793): at com.sec.CompassWidget2.MainCompassAppWidgetProvider.updateAppWidget(MainCompassAppWidgetProvider.java:158)
06-25 22:55:29.812: W/System.err(4793): at com.sec.CompassWidget2.MainCompassAppWidgetProvider.onUpdate(MainCompassAppWidgetProvider.java:141)
06-25 22:55:29.812: W/System.err(4793): at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:61)
06-25 22:55:29.817: W/System.err(4793): at com.sec.CompassWidget2.MainCompassAppWidgetProvider.onReceive(MainCompassAppWidgetProvider.java:50)
06-25 22:55:29.817: W/System.err(4793): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2131)
06-25 22:55:29.817: W/System.err(4793): at android.app.ActivityThread.access$1500(ActivityThread.java:127)
06-25 22:55:29.817: W/System.err(4793): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1209)
06-25 22:55:29.822: W/System.err(4793): at android.os.Handler.dispatchMessage(Handler.java:99)
06-25 22:55:29.822: W/System.err(4793): at android.os.Looper.loop(Looper.java:137)
06-25 22:55:29.822: W/System.err(4793): at android.app.ActivityThread.main(ActivityThread.java:4507)
06-25 22:55:29.827: W/System.err(4793): at java.lang.reflect.Method.invokeNative(Native Method)
06-25 22:55:29.827: W/System.err(4793): at java.lang.reflect.Method.invoke(Method.java:511)
06-25 22:55:29.827: W/System.err(4793): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
06-25 22:55:29.827: W/System.err(4793): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
06-25 22:55:29.832: W/System.err(4793): at dalvik.system.NativeStart.main(Native Method)
=================================================================================