2014-01-11 89 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