2012-02-11 18 views
1
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    switch (requestCode) 
    { 
    case REQUEST_VOICE: 
     if (resultCode != RESULT_OK) break; 
     ArrayList<String> raw = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
     dialogAdapter.add(raw.get(0)); 
     dialogAdapter.notifyDataSetChanged(); // Doesn't work?! 
     String res = "http://192.168.0.197/xyz.php?v=1"; 
     res = getFromUrl(res); // Get content from internet 
     if (!res.startsWith("{")) res = "Error."; 
     else { 
      try { 
       JSONObject json = new JSONObject(res); 
       dialog.set(dialog.lastIndexOf(raw.get(0)), json.getString("in")); // Should update the row that was added before the call of getFromUrl() 
       res = json.getString("out"); 
      } catch (Exception e) { 
       res = "Error"; 
      } 
     } 
     dialogAdapter.add(res); 
     dialogAdapter.notifyDataSetChanged(); // Works? 
     break; 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

(我已經縮短了上面的代碼。) 功能(onActivityResult)後ListView控件(dialogAdapter是適配器)將刷新完全執行, 但我想追加在我調用getFromUrl()之前的一行。Android的 - 刷新ListView的HTTP請求之前

請幫助。

回答

1

的代碼工作正常,因爲它預期

發生在這裏的是你的應用程序繼續執行,直到這裏的問題..

dialogAdapter.add(raw.get(0)); 
dialogAdapter.notifyDataSetChanged(); // Doesn't work?! 

實際上它的工作原理,但你在呼喚它掛在UI另一個任務線程,那就是:

res = getFromUrl(res); 

它掛在UI線程更新本身和數據之後已經進賬 這條線再次執行。

dialogAdapter.notifyDataSetChanged(); // Works? 

和ListView更新。

Solutino:永遠不要在UI線程上執行URL請求。使用AsyncTask

+0

謝謝,它的工作。 :) – DragonWork 2012-02-11 13:53:24