Эффективные средства для опроса из источника и обновления пользовательского интерфейса на Android? - PullRequest
0 голосов
/ 08 сентября 2011

Я пытаюсь периодически запрашивать информацию на определенном веб-сайте, а затем обновлять пользовательский интерфейс в приложении для Android.

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

  1. Требуется ли view.post(new Runnable()); или обрабатываются широковещательные рассылки в потоке пользовательского интерфейса (что позволяет выполнять AsyncTask напрямую, поскольку это должно быть сделанопользовательский интерфейс)?

  2. Есть ли способ периодически запускать AsyncTask (или что-то похожее), кроме настройки сигналов тревоги и получения Intents?

Вот упрощенная версия того, что я использую:

public class WebUpdates extends BroadcastReceiver
{

private AlarmManager am ;
private PendingIntent pi ;
private View view ; 
private Context listener ; 

public WebUpdates(Context listener, View view)
{
    this.listener= listener; 
    this.view = view ;

    am = (AlarmManager)listener.getSystemService(Context.ALARM_SERVICE) ;
    pi = PendingIntent.getBroadcast((Context)listener, 0, new Intent("WEBUPDATE"), 0) ;

    am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 0, (long)15000, pi) ;
}

@Override
public void onReceive(Context context, Intent intent) 
{
    view.post(new Runnable() {
        public void run()
        {
            new WebUpdateTask().execute() ;
        }
    }) ;
}

private class WebUpdateTask extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... v) 
    {
        // bunch of web stuff... 
    }

    public void onPostExecute(Void v)
    {
        view.doBunchOfUpdates() ;
    }
}
}

Это мой первый вопрос, поэтому я прошу прощения за любые проблемы с форматированием.Любой вклад или помощь будет высоко ценится!

1 Ответ

0 голосов
/ 08 сентября 2011
  1. Согласно документации onReceive () исключает основной поток. Таким образом, вы должны иметь возможность запустить AsyncTask напрямую.
  2. Другой вариант - использовать Таймер и TimerTask . В сети есть несколько примеров, вот one . AlarmManager лучше, если вам нужно получить намерение, даже если ваша активность не активна. Timer и TimerTask могут быть лучше, если вам нужно только периодическое поведение во время работы Activity. Да, и я думаю, ScheduledThreadPoolExecutor предпочтительнее для нового кода; Я только что использовал Timer / TimerTask в прошлом.

Но я не думаю, что использование AlarmManager принесет какой-либо вред, даже если вам нужно обновлять только при использовании приложения, если вы отменили сигнал тревоги в onPause ().

...