刷新数据Android应用程序

时间:2011-10-01 20:31:57

标签: android web-services timer refresh

我创建了一个使用Web服务提供信息的android应用程序,然后当应用程序启动时,我将数据放入sqlite中,并从数据库管理所有内容。应用程序启动后,数据将填充tablelayout。

现在我想每隔20秒刷新一次内容(因为来自网络服务的信息可能会改变)。

我该怎么做?我使用了onResume方法,但每次你回到tablelayout时我都不想刷新内容。

所以我想做的是每20秒执行一次oncreate方法(连接webservice,填充我的tablelayout并显示它)。我读过关于计时器或处理程序但我不知道怎么能这样做。

现在我遇到了问题!

我从Web服务获取数据并在我的doInBackground中的数据库中插入数据..没关系。现在,我在onPostExecute方法中创建所有textview,tablerow等,但我有2个问题。 首先,

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

我在doInBackground方法中有一个上下文问题

在onPostExecute方法中,我对所有“this”都有同样的问题,比如TableRow rowTitulo = new TableRow(this);

我知道这是一个上下文错误,我基本上知道上下文是如何工作的,但我不知道如何解决这个上下文问题。我认为初始化异步构造函数中的上下文可能有帮助,我替换在onpost ..请帮忙!

3 个答案:

答案 0 :(得分:8)

首先,您不希望从Web服务读取数据或将其写入onCreate方法中的SQLite数据库。您需要生成一个新线程来执行此操作,以便它不会导致应用程序冻结。您可以创建一个Thread或使用AsyncTask。如果使用AsyncTask,则可以覆盖其onPostExecute方法。这将在主UI线程上执行,因此您可以在此方法中刷新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 :(得分:1)

也许你可以启动一个运行无限循环的新线程,该循环每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

答案 2 :(得分:0)

计时器任务和线程应该有效。这是一个例子:

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();
}

请参阅this链接,因为它有更好的处理线程的示例。