2014-01-11 90 views
0

我有一个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)。

亲切的问候!

+0

用于在2分钟后刷新带有新值的'ListView',您可以使用服务 –

+0

您能说更多吗?任何示例?我需要每2分钟完成一次POST,然后解析并重复所有内容。 +当我有这样的事情时使用服务是一个好主意,应该在UI Thread之外完成?我是初学者@所有这些东西,对不起,如果被问到有关愚蠢的东西 – user2987001

+0

请参阅http://www.vogella.com/tutorials/AndroidServices/article.html请 –

回答

2

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

如果您选择使用Timer,然后在onPause中无效并在onStart中重新启动,则当应用程序位于后台时不需要更新。如果你想要的话,你需要添加更多的逻辑,比如在你的Activity被重新创建后使用的临时存储列表。另外,我看到你正在清理你的ListView中当前使用的doInBackground的列表,这是错误的,你应该从doInBackground返回新的列表内容并在onPostExecute中更新ListView,否则你正在引入数据竞争。

+0

嗯,我认为的第一件事是在解析此JSON之前清除整个列表并从一开始就得到列表,不知何故,我发现它是合乎逻辑的。我会记住您的建议,我会尽力按照您的建议进行操作,谢谢:) – user2987001