안녕하세요 초보 앱 개발자입니다.
이번에 디지털 시계 위젯을 개발 중에 있는데 막상 만들고 나니 돌아가긴 돌아가는데
중간에 메모리 과부하가 걸려서 그런건지 아니면 다른 이유에서인지 갑자기 중간에 시계가 멈추는 현상이 발생합니다.
이런 경우 어떻게 해결해야 할지 알려주실수 있으실런지요?
예시코드 하기에 작성했습니다.
답변주시면 감사하겠습니다.
================================================================================================
public class DigitalClock extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// TODO Auto-generated method stub
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 0, 1000);
}
class MyTime extends TimerTask{
RemoteViews remoteviews;
AppWidgetManager appwidgetmanager;
ComponentName componentname;
public MyTime(Context context, AppWidgetManager appWidgetManager) {
// TODO Auto-generated constructor stub
appwidgetmanager = appWidgetManager;
remoteviews = new RemoteViews(context.getPackageName(),R.layout.main);
componentname = new ComponentName(context, DigitalClock.class);
}
@Override
public void run() {
// TODO Auto-generated method stub
Date date;
date = new Date(System.currentTimeMillis());
int hour = date.getHours();
int minute = date.getMinutes();
int second = date.getSeconds();
//hour
switch(hour){
case 0 :
remoteviews.setImageViewResource(R.id.hour_1, R.drawable.num_0);
remoteviews.setImageViewResource(R.id.hour_2, R.drawable.num_0);
break;
case 1 :
remoteviews.setImageViewResource(R.id.hour_1, R.drawable.num_0);
remoteviews.setImageViewResource(R.id.hour_2, R.drawable.num_1);
break;
case 2 :
remoteviews.setImageViewResource(R.id.hour_1, R.drawable.num_0);
remoteviews.setImageViewResource(R.id.hour_2, R.drawable.num_2);
break;
(이런 식으로 24시간 표현, 분도 0~59까지 같은 방식(switch문)으로 표현)
.
.
.
appwidgetmanager.updateAppWidget(componentname, remoteviews);
}
}
}
=================================================================================
layout의 경우, 코드에서 유추할 수 있듯이, hour와 minute 에 대한
Imageview를 각각 2개씩 만들어 horizontal로 나열했습니다.
나머지는 앱위젯 개발환경에 맞게 setting 했습니다.




시계위젯을 만드는데 Timer를사용하여, background thread를 실행하는것보다는... AppWidgetProvider에서 ACTION_TIME_TICK 을 받아서 처리하는것이 여러모로 좋을것 같네요. 이미 원하는 기능(Timer)이 시스템에서 구현되어 있으니까요^^;