正确循环解析JSON的AsyncTask

时间:2014-01-11 17:14:12

标签: android json listview android-asynctask onclicklistener

我有一个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),然后点击该新活动中的“返回”(返回给定的一个)。

亲切的问候!

1 个答案:

答案 0 :(得分:2)

您可以使用Timer和TimerTask在指定的时间间隔内执行AsyncTask,但请记住TimerTask在工作线程上执行,您应该只在UI线程上执行AsyncTask,因此您必须使用handler或runOnUithread方法来正确执行AsyncTask。 / p>

如果您选择使用Timer,然后在onPause中使其无效并在onStart中重新启动,则当应用程序处于后台时您不希望更新。如果您需要添加更多逻辑,例如存储临时列表,以便在重新创建Activity后使用。

另外,我看到你正在清理当前由ListView使用的doInBackground中的列表,这是错误的,你应该从doInBackground返回新的列表内容并更新onPostExecute中的ListView,否则你将引入数据竞争。