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

 

다름이 아니라 나침반 위젯을 개발하는데 중간에 값이 계속 멈춰서 문의드립니다.

제가 개발 지식이 딸리는지라 위젯에서 나침반 방향침을 돌리는 방법은 모르겠고해서

실시간 업데이트 시간을 0.5초 정도로 하여 그 때마다 값을 받아와 그에 맞는 이미지로 갱신하는 방법으로

나침반을 제작했는데요. (물론 아직 마그네틱 센서 및 가속도 센서를 적용하지는 않았습니다.)

방향센서를 통해서 값을 받아서 찍는데 처음엔 이미지가 잘 갱신되다가 후에 가면

값이  멈추더군요..

이렇게 멈추는 현상을 없앨 수 있는 방법이 없을까요? 문의드립니다.

고수님들의 답변 기다리겠습니다. 감사합니다.

 

(code)

public class MainCompassAppWidgetProvider extends AppWidgetProvider {

 private static final int WIDGET_UPDATE_INTERVAL = 500;
 private static PendingIntent mSender;
 private static AlarmManager mManager;

 //static : 전 class에서 값 공유함
 static SensorManager mSensorManager = null;
 static Sensor oriSensor = null;
 static SensorEventListener oriL = null;
 static int data=0;

 // 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();

   long firstTime = System.currentTimeMillis() + WIDGET_UPDATE_INTERVAL;
   mSender = PendingIntent.getBroadcast(context, 0, intent, 0);
   mManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
   mManager.set(AlarmManager.RTC, firstTime, mSender);
  }
  // 위젯 제거 인텐트를 수신했을 때
  else if(action.equals("android.appwidget.action.APPWIDGET_DISABLED"))
  {
   removePreviousAlarm();
  }
 }


 public static final int[] mCompassImage = {
  R.drawable.img_compass_arr_0,R.drawable.img_compass_arr_1,R.drawable.img_compass_arr_2,R.drawable.img_compass_arr_3,R.drawable.img_compass_arr_4,R.drawable.img_compass_arr_5,
  R.drawable.img_compass_arr_6,................ }; //360개 이미지 제작 


 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];
   updateAppWidget(context, appWidgetManager, appWidgetId);

  } 
 }

 

 

 //위젯의 형태를 업데이트합니다.   
 //@param context 컨텍스트
 //@param appWidgetManager 위젯 메니저
 //@param appWidgetId 업데이트할 위젯 아이디

 void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
 {
  mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); //SensorManager 인스턴스를 가져옴
  oriSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); // 방향센서

  mSensorManager.registerListener(oriL, oriSensor, SensorManager.SENSOR_DELAY_GAME);     //방향센서 Listener object 등록
  oriL = new eventListener(); //방향센서 Listener instance
  RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.main_compass_activity);

  int sec = 0;
   sec = data;  

  Log.e("---Debug---",Integer.toString(data));
  
  updateViews.setImageViewResource(R.id.compass_background, R.drawable.img_compass_bg);
  updateViews.setImageViewResource(R.id.compass_bar, mCompassImage[sec]);
  appWidgetManager.updateAppWidget(appWidgetId, updateViews);
 }

 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
   data = (int)event.values[0];  
  } 
 }


 //예약되어있는 알람을 취소합니다.
 public void removePreviousAlarm()
 {
  if(mManager != null && mSender != null)
  {
   mSender.cancel();
   mManager.cancel(mSender);
  }
 }
}