У меня есть 4 действия. В каждом действии один таймер я использовал для загрузки данных каждую минуту. теперь я использую 4 таймера в 4 действиях. Теперь я хочу, возможно ли управлять всеми 4 действиями, загружаемыми данными с одного таймера.? если это возможно, укажите пример.
Благодаря....
Да, вы можете сделать это в фоновом режиме и нажимать обновления для своих действий либо путем обновления GUI напрямую, либо путем имплантации шаблона 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 и переопределить метод обновления. Пожалуйста, прокомментируйте, если вы его заработаете или у вас возникли проблемы с использованием примера.