Android: невозможно ли управлять загрузкой данных 2+ мероприятий через один таймер - PullRequest
1 голос
/ 19 марта 2012

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

Спасибо ....

1 Ответ

2 голосов
/ 19 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...