我创建了一个使用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 ..请帮忙!
答案 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链接,因为它有更好的处理线程的示例。