我有一个Android应用程序。我像这样扩展了AsyncTask类:
@Override
protected Void doInBackground(String... data) {
String jsonData = Webserv.getTaskJson(data[0]);
taskArrayList.clear();
try {
JSONArray jsonArray = new JSONArray(jsonData);
for(int i=0; i<jsonArray.length(); i++){
JSONObject t = jsonArray.getJSONObject(i);
String taskString = t.getString("id");
String latString = t.getString("lat");
String lonString = t.getString("lon");
String adrsString = t.getString("adrs");
taskArrayList.add(taskString+ "#" +latString + "$" + lonString + "%" + adrsString);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void v){
dialog.dismiss();
taskAdapter.notifyDataSetChanged();
super.onPostExecute(v);
}
}
函数getTaskJson返回我随后解析的JSON字符串。在ListView项目中打印解析的字符串。一切正常(尽管切割这些字符串对我来说似乎很傻,但我不知道如何以其他方式获取数据)
taskList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {
TextView tv = (TextView) viewClicked;
String clicked= tv.getText().toString();
String idTaskClicked = clicked.substring(0, clicked.indexOf('#'));
String latTaskClicked = clicked.substring(clicked.indexOf('#')+1, clicked.indexOf('$'));
String lonTaskClicked = clicked.substring(clicked.indexOf('$')+1, clicked.indexOf('%'));
String adrsTaskClicked = clicked.substring(clicked.indexOf('%')+1);
Intent intent = new Intent(context, TaskDetailsActivity.class);
intent.putExtra(EXTRA_TASK_ID, idTaskClicked);
intent.putExtra(EXTRA_ID, getIntent().getStringExtra(MainActivity.EXTRA_ID));
intent.putExtra(EXTRA_USERNAME, getIntent().getStringExtra(MainActivity.EXTRA_USERNAME));
intent.putExtra(EXTRA_TASK_LAT, latTaskClicked);
intent.putExtra(EXTRA_TASK_LON, lonTaskClicked);
intent.putExtra(EXTRA_TASK_ADRS, adrsTaskClicked);
startActivity(intent);
}
});
嗯,无论如何,这一切现在都可行。问题是:我需要让这个应用程序与我的网页同步。为了保持“同步”,我想循环这个获取JSON并将任务解析/放入ListView的AsyncTask。例如,我想用新的值“刷新”这个ListView,比方说2分钟。任何建议我怎么能这样做?还有一个问题:点击列表视图中的项目后,我开始新的活动。我是否会遇到AsyncTasks的任何问题(实际上有两个问题:一个用于解析JSON,第二个用于简单地发送带有地理坐标的POST),然后点击该新活动中的“返回”(返回给定的一个)。
亲切的问候!
答案 0 :(得分:2)
您可以使用Timer和TimerTask在指定的时间间隔内执行AsyncTask,但请记住TimerTask在工作线程上执行,您应该只在UI线程上执行AsyncTask,因此您必须使用handler或runOnUithread方法来正确执行AsyncTask。 / p>
如果您选择使用Timer,然后在onPause中使其无效并在onStart中重新启动,则当应用程序处于后台时您不希望更新。如果您需要添加更多逻辑,例如存储临时列表,以便在重新创建Activity后使用。
另外,我看到你正在清理当前由ListView使用的doInBackground中的列表,这是错误的,你应该从doInBackground返回新的列表内容并更新onPostExecute中的ListView,否则你将引入数据竞争。