正确地循环解析JSON的AsyncTask
我有一个android应用程序。我扩展AsyncTask类如下:正确地循环解析JSON的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);
}
});
好了,反正这一切工作正常了。问题是:我需要这个应用程序与我的网页同步。为了保持它“同步”,我想LOOP这个AsyncTask获取JSON并解析/将任务放入ListView中。例如,我想用新值“刷新”这个ListView,比如2分钟。任何建议我怎么能这样做?还有一个问题:在从列表视图中点击一个项目后,我开始新的活动。点击后面的“返回”(在这里回到给定的)后,我会遇到任何与AsyncTasks有关的问题(实际上有两个问题:一个用于解析JSON,第二个用于发送带有地理坐标的POST)。
亲切的问候!
您可以使用Timer和TimerTask以指定的时间间隔执行AsyncTask,但请记住TimerTask在工作线程上执行,并且您应该只在UI线程上执行AsyncTask,因此您必须使用handler或runOnUithread方法来正确执行AsyncTask。
如果您选择使用Timer,然后在onPause中无效并在onStart中重新启动,则当应用程序位于后台时不需要更新。如果你想要的话,你需要添加更多的逻辑,比如在你的Activity被重新创建后使用的临时存储列表。另外,我看到你正在清理你的ListView中当前使用的doInBackground的列表,这是错误的,你应该从doInBackground返回新的列表内容并在onPostExecute中更新ListView,否则你正在引入数据竞争。
嗯,我认为的第一件事是在解析此JSON之前清除整个列表并从一开始就得到列表,不知何故,我发现它是合乎逻辑的。我会记住您的建议,我会尽力按照您的建议进行操作,谢谢:) – user2987001
用于在2分钟后刷新带有新值的'ListView',您可以使用服务 –
您能说更多吗?任何示例?我需要每2分钟完成一次POST,然后解析并重复所有内容。 +当我有这样的事情时使用服务是一个好主意,应该在UI Thread之外完成?我是初学者@所有这些东西,对不起,如果被问到有关愚蠢的东西 – user2987001
请参阅http://www.vogella.com/tutorials/AndroidServices/article.html请 –