2010-05-24 93 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