Обновить данные Android-приложения - PullRequest
2 голосов
/ 02 октября 2011

Я сделал приложение для Android, которое доставляет информацию с помощью веб-службы, а затем, когда приложение запускается, я помещаю данные в sqlite и управляю всем из своей базы данных.После запуска приложения данные заполняют таблицу.

Теперь я хочу обновлять этот контент каждые 20 секунд (поскольку информация из веб-службы может измениться).

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

Итак, я хочу выполнить метод oncreate (который соединяется с веб-сервисом, заполняетмою таблицу и отображать ее) каждые 20 секунд.Я читал о таймере или обработчике, но я не уверен, как мне это сделать.

Теперь у меня проблема!

Я получаю данные из веб-службы и вставляю данные в базу данных в моем doInBackground... это нормально.Теперь я создаю все текстовые представления, таблицы и т. Д. В методе onPostExecute, но у меня есть 2 проблемы.Во-первых,

UsuariosSQLiteHelper usdbh = new UsuariosSQLiteHelper(this, "DBIncidentes", null, 1);

У меня есть проблема контекста, в методе doInBackground

и в методе onPostExecute у меня та же проблема со всем «this», как TableRow rowTitulo = new TableRow(this);

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

Ответы [ 3 ]

8 голосов
/ 02 октября 2011

Прежде всего, вы не хотите читать данные из веб-службы ИЛИ записывать их в базу данных SQLite с помощью метода onCreate. Для этого вам нужно создать новый поток, чтобы приложение не зависало. Вы можете создать поток или использовать AsyncTask для этого. Если вы используете AsyncTask, вы можете переопределить его метод onPostExecute. Это будет выполнено в основном потоке пользовательского интерфейса, поэтому вы можете обновить TableLayout этим методом.

Как только этот код будет работать правильно, вам просто нужно запланировать его. Самый простой способ сделать это - использовать Timer . Вот некоторый скелетный код, который поможет вам начать:

class MyTask extends AsyncTask<Void,Void, MyDataStructure>{
    @Override
    protected MyDataStructure doInBackground(Void... params) {
        MyDataStructure data = new MyDataStructure();
        // get data from web service
        // insert data in database
        return data;
    }

    @Override
    protected void onPostExecute(MyDataStructure data) {
        TableLayout table = (TableLayout) findViewById(R.id.out);
        // refresh UI
    }
}

Timer timer = new Timer();
TimerTask task = new TimerTask(){

    @Override
    public void run() {
        new MyTask().execute();
    }

};
long whenToStart = 20*1000L; // 20 seconds
long howOften = 20*1000L; // 20 seconds
timer.scheduleAtFixedRate(task, whenToStart, howOften);
1 голос
/ 02 октября 2011

Может быть, вы могли бы запустить новый поток, который выполняет бесконечный цикл, который извлекает данные каждые 20 секунд:

    private Handler mHandler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                fetchData();
                try {
                    Thread.sleep(20000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    t.start();
}

private void fetchData() {
    // Get the data from the service

    mHandler.post(new Runnable() {
        @Override
        public void run() {
            // This will run on the ui thread
            // Update UI with the data here
        }
    });
}

Если вам нужно обновить данные, даже когда ваша деятельность остановлена, вы должны посмотретьна услуги: http://developer.android.com/guide/topics/fundamentals/services.html

0 голосов
/ 02 октября 2011

Задача таймера и поток должны работать. Вот пример:

Timer refreshTask = new Timer();
Thread refreshThread = new Thread(new Runnable() {
    public void run() {
      //pull data
    }
  });

refreshTask.scheduleAtFixedRate(new TimerTask(){ 
    public void run()
    {
        onTimerTick_TimerThread();
    }

}, 0, 30000L);

public void onTimerTick_TimerThread()
{

    refreshThread.start();
}

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

...