2010-05-24 4 views
1

Привет,Частые Android Виджет Обновления

Я пытаюсь написать часы виджет, который отображает Epoch время и мне нужно обновить каждую секунду. В настоящее время я делаю это с помощью службы, которая использует обработчик:

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); 
    } 
}; 

} 

Проблема у меня в том, что в течение долгого времени, мой домашний экран появляется, чтобы заметно лага. Я довольно новичок в Android, поэтому не уверен, что то, что я делаю, - это правильный подход или есть лучший способ достичь этого (возможно, с AsyncTask?). Есть ли способ часто обновлять виджет, не испытывая отставания в пользовательском интерфейсе? Если мне нужно разместить больше кода, пожалуйста, дайте мне знать. Мой виджет просто запускает и останавливает эту службу, а у моего разработчика приложений - android: updatePeriodMillis = «0».

Заранее благодарим за помощь.

ответ

1

Я пытаюсь написать виджет часов , который отображает Epoch время и мне нужно обновить каждую секунду.

Просьба не обращаться. Ваши пользователи атакуют вас вилами. Выполнение удаленного вызова процедур каждую секунду значительно замедлит работу устройства и разрядит аккумулятор.

Если вы хотите, чтобы часы на главном экране обновлялись каждую секунду, создайте пользовательский главный экран, чтобы все это можно было выполнить в одном процессе.

Проблема у меня в том, что за время, мой домашний экран появляется, чтобы получить заметно лага.

Этого можно ожидать.

Есть ли способ, чтобы обновить виджет зачастую не страдает от УИ лаг?

No. Частота обновления по умолчанию - каждые 30 минут, а не каждую секунду.

+0

Вы говорите, что нет способа написать виджет часов с секундной стрелкой без написания нового главного экрана? это не кажется правильным. – Jon

+1

«Вы говорите, что нет способа написать виджет часов с секундной стрелкой без написания нового главного экрана?» Верный. Система виджета приложений не предназначена для быстро изменяющихся данных, и один раз в секунду определенно квалифицируется как «быстро меняющийся». – CommonsWare

+0

@CommonsWare так, что делать, если разработчик хочет разработать виджет часов, в котором час, мин, второй дизайн по изображениям. для второго. Необходимо изменить изображение каждую секунду, чтобы реализовать это. Можете ли вы дать какое-либо решение для этого? –

Смежные вопросы