2010-05-24 87 views
1

问候,频繁Android小部件更新

我想写一个时钟小部件,显示纪元的时间,我需要它来更新每一秒。目前我使用的是采用了处理程序服务这样做:

public class EpochService extends Service { 

private static final String TAG = "EpochService"; 

// the time 
private static long mTime; 

// ui components 
private static RemoteViews mViews; 
private static ComponentName mComponent; 
private static AppWidgetManager mManager; 

// handler 
private static Handler mHandler = new Handler(); 

@Override 
public void onStart(Intent intent, int id){ 
    Log.i(TAG, "start"); 

    // register the receiver 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    filter.addAction(Intent.ACTION_SCREEN_ON); 
    registerReceiver(mIntentReceiver, filter); 

    // set up ui 
    mViews = new RemoteViews(this.getPackageName(), R.layout.main); 
    mManager = AppWidgetManager.getInstance(this); 
    mComponent = new ComponentName(this, Clock.class); 

    // start 
    mHandler.removeCallbacks(mEpochTimerTask); 
    mHandler.postDelayed(mEpochTimerTask, 1000); 
} 

@Override 
public void onDestroy(){ 
    // unregister receiver to prevent memory leak 
    mHandler.removeCallbacks(mEpochTimerTask); 
    unregisterReceiver(mIntentReceiver); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

/** 
    * The broadcast receiver - handles screen off events to stop drawing 
    */ 
private static BroadcastReceiver mIntentReceiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){ 
    Log.i(TAG, "stop drawing"); 
    mHandler.removeCallbacks(mEpochTimerTask); 
    } 
    else { 
    Log.i(TAG, "start drawing"); 
    mHandler.removeCallbacks(mEpochTimerTask); 
    mHandler.postDelayed(mEpochTimerTask, 1000); 
    } 
    } 
}; 

/** 
    * Run the Epoch Timer 
    */ 
private static Runnable mEpochTimerTask = new Runnable(){ 
    @Override 
    public void run() { 
    Log.i(TAG, "run"); 
    mTime = System.currentTimeMillis()/1000; 

    mViews.setTextViewText(R.id.time, Long.toString(mTime)); 
    mManager.updateAppWidget(mComponent, mViews); 
    mHandler.postAtTime(mEpochTimerTask, SystemClock.uptimeMillis() + 1000); 
    } 
}; 

} 

我遇到的问题是,随着时间的推移,我的主屏幕似乎得到明显laggy。我对Android相当陌生,所以我不确定我所做的是正确的方法,还是有更好的方法来实现这一点(也许使用AsyncTask?)。有没有办法频繁更新小部件而不会受到UI滞后的影响?如果我需要发布更多代码,请告诉我。我的小部件只是启动和停止这项服务,而我的appwidget-provder有android:updatePeriodMillis =“0”。

在此先感谢您的帮助。

回答

1

我想写一个时钟部件 显示大纪元时间,我需要它 以每秒更新一次。

请不要。你的用户会用干草叉攻击你。每秒进行一次远程程序调用会大大减慢设备速度,并会耗尽电池电量。

如果您希望主屏幕上的时钟每秒更新一次,请编写自定义主屏幕,以便它们都可以在一个进程中完成。

我遇到的问题是,随着时间的 ,我的主屏幕似乎得到 明显laggy。

这是可以预料的。

有没有办法更新一个小部件 频繁而不会受到UI 滞后?

否。默认更新频率是每30分钟一次,而不是每秒。

+0

你是说在没有编写新的主屏幕的情况下没有办法用秒针写一个时钟部件?这看起来不正确。 – Jon 2010-05-24 23:52:56

+1

“你是说在没有编写新的主屏幕的情况下没有办法用秒针写一个时钟部件?”正确。应用小部件系统不是为快速变化的数据而设计的,每秒一次的数据绝对符合“快速变化”的要求。 – CommonsWare 2010-05-25 00:09:45

+0

@CommonsWare所以,如果开发人员想要开发一个小时,分钟,秒图像设计的小部件,该怎么办。第二它需要每秒更改图像,因此,如何实现这一点。你能为此提供任何解决方案吗? – 2012-09-19 11:34:10