实施AsyncTask
时遇到问题。我必须旋转手机以获取最新信息。以下是我的课程:
GamerObject gamer;
….
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ip = "134.188.204.155";
// Set the name of the gamer
gamername = (TextView) findViewById(R.id.gamer_name);
// Set the gamerstatus:
gamerstatus = (TextView) findViewById(R.id.tvgamer_status_msg);
// set the job status
jobstatus = (TextView) findViewById(R.id.tvJob_status_msg);
new Operation().execute();
}
private class Operation extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
gamer= new GamerObject(ip);
gamer.UpdateAllData();
}
@Override
protected void onPostExecute(Void result) {
updateUI();
}
}
private void updateUI() {
gamer.updateAllData();
// Set the name of the gamer
TextView gamername = (TextView) findViewById(R.id.gamer_name );
gamername.setText(gamer.gamername);
gamername = gamer.gamername ;
// Set the gamer status:
…
// set the job status
…
}
在我使用Intent刷新界面之前,现在我想尝试使用AsyncTask
以便它可以与Android版本4兼容。任何人都知道如何在不旋转手机的情况下更新信息?
修改
如果我没有错,为什么我的UI在没有新值的情况下不会刷新,这是因为new Operation().execute();
仅在onCreate中使用一次。如果调用了onCreate,则会执行AsyncTask,这意味着每次旋转手机时都会进入onCreate。有谁知道如何保持AsyncTask执行?
答案 0 :(得分:1)
AsyncTask
只会被执行一次,所以每当系统调用onCreate对你的活动进行一些生命周期事件时,就会执行asyncTask。
一种简单但天真的方法是创建新的Thread
并使用Handler
更新您的用户界面。可以找到更多信息,例如。 here,当然还有Android doc。
更好的方法,但更复杂的是使用Loader
和LoaderCallback
以及ContentProvider
作为@metter提到的。这将需要实现您自己的ContentProvider
并强制您向应用添加更多“抽象层”,但允许将网络基本代码和ui代码分开。
所以这一直是一个艰难的决定,要么使用“简单”,要么使用带有线程的“ugle”解决方案,或者使用ContentProvier
答案 1 :(得分:0)
我希望自动更新inofrmation而无需旋转手机。
这样做需要更多的工作。不幸的是,我们无法看到您的异步任务实际上做了什么。如果它正在从数据库中读取数据,并且您不希望UI通知数据库的任何更改,那么您的内容解析器可以调用它的notifyChange,您的Activity将监听这些更改,然后再次调用异步任务。为此,您将使用Content Observer。但是,如果您的任务是从Web下载数据,那么有两种方法可以在线更改数据时获取通知。一种称为轮询,意味着您定期连接并检查服务器。由于电池,性能和数据流量的限制,您不应该在移动设备上执行此操作。另一种叫做推送,需要你设置一些infrastructure。
我希望能帮助你。