Да, вы можете делать это в фоновом режиме и загружать обновления в свои действия, либо напрямую обновляя графический интерфейс, либо внедряя шаблон Observer.
Теперь у меня есть полностью рабочий пример, который может вам помочь.Хорошо, сначала создайте класс Observable, что-то вроде этого:
public class MyObservable extends Observable {
int n = 0;
public void setValue(int n) {
setChanged();
notifyObservers(n);
}
public int getValue()
{
return n;
}
}
И создайте задачу, вы должны скорректировать ваши параметры, я просто ленивый:)
public class MyTask extends AsyncTask
{
MyObservable observable;
int numberOfNotifications = 0;
@Override
protected Object doInBackground(Object... params) {
try {
this.observable = (MyObservable) params[0];
while (true) {
numberOfNotifications++;
int timeSinceLastUpdate = 1000*5;
Thread.sleep(timeSinceLastUpdate);
publishProgress(numberOfNotifications);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Object... values) {
observable.setValue((Integer) values[0]);
}
}
Тогда выможет расширить класс Application и запустить там поток:
public class StackApplication extends Application {
private static MyObservable myObservable;
@Override
public void onCreate() {
super.onCreate();
myObservable = new MyObservable();
new MyTask().execute(myObservable);
}
public static MyObservable getObservable() {
return myObservable;
}
}
Здесь нужно отметить одну вещь - шаблон singelton, обеспечивающий получение только одного экземпляра Observable.В таком случае легко реализовать Observer в ваших соответствующих действиях:
public class FirstActivity extends Activity implements Observer {
TextView tvCounter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvCounter = (TextView) findViewById(R.id.hello);
StackApplication.getObservable().addObserver(this);
}
@Override
public void update(Observable observable, Object data) {
int i = (Integer) data;
tvCounter.setText(Integer.toString(i));
}
}
Это должно сработать, и если вы не захотите использовать этот шаблон в другом действии, просто не забудьте добавить Observer и переопределить метод обновления.Пожалуйста, прокомментируйте, если у вас получилось, или у вас возникли проблемы с использованием примера.