2013-02-26 27 views
0

我一直試圖圍繞下面的問題圍繞過去6小時如此,但我無法弄清楚。我相信它應該是一個容易解決的問題,但不知道它不是。第一次完成()在成功處理程序工作正常,第二完成()不

我使用一個Async HTTP library其中有幾個完成處理程序,其中之一是onSuccess()。我的成功處理程序的代碼如下所示:

@Override 
public void onSuccess(String json) { 
    // {"statusId":12,"statusText":"Ongeldige logincode","result":[],"duration":"0.320","update":[]} 
    // {"statusId":1,"statusText":"OK","result":{"id":"38790","planHash":"0FYzJAodmQzUnZkSEJzWVc1dWFXNW5KbXhzYm5WdFBUTTROemt3","warnCBR":"NO","data":{"name":"Jeroen Dielemans","mail":"[email protected]","address":"Oude Antwerpse Postbaan 6","zip":"4741TK","city":"Hoeven","phone":"0165-502684","mobile":"06-15617390"}},"duration":"1.538","update":[]} 
    json = "{\"statusId\":1,\"statusText\":\"OK\",\"result\":[],\"duration\":\"3.910\",\"update\":{\"id\":22,\"title\":\"Update!\",\"text\":\"Hee er is een nieuwe versie ;)\",\"button\":\"Open\",\"link\":\"market:\\/\\/details?id=com.dga.blom>\"}}"; 

    Integer statusId = 1; // 1 == success 
    String statusText = null; 
    JSONObject result = null; 
    JSONObject update = null; 

    try { 
     JSONObject object = (JSONObject) new JSONTokener(json) 
       .nextValue(); 
     statusId = object.getInt("statusId"); 
     statusText = object.getString("statusText"); 
     result = object.optJSONObject("result"); 
     update = object.optJSONObject("update"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    if (statusId != 1) { 
     showAlertDialog(getString(R.string.failed), statusText); 
    } else { 
     InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); 
     inputMethodManager.hideSoftInputFromWindow(
       getCurrentFocus().getWindowToken(), 0); 

     if (result != null) { 
      SharedPreferences prefs = getSharedPreferences(
        Constants.SHARED_PREFS, Context.MODE_PRIVATE); 
      Editor editor = prefs.edit(); 
      editor.putString(Constants.SHARED_PREFS_USER, 
        result.toString()); 
      editor.commit(); 

      Intent refreshIntent = new Intent(
        Constants.INTENT_REFRESH_ACTION); 
      sendBroadcast(refreshIntent); 
     } 

     if (update == null) { 
      finish(); /* ALWAYS closes activity */ 
     } else { 
      int updateId = update.optInt("id", -1); 
      SharedPreferences prefs = getSharedPreferences(
        Constants.SHARED_PREFS, Context.MODE_PRIVATE); 
      int lastId = prefs.getInt(
        Constants.LAST_UPDATE_MESSAGE_ID, -1); 

      if (updateId > lastId) { 
       showUpdateDialog(update); 
      } else { 
       finish(); /* NEVER closes activity */ 
      } 
     } 
    } 
} 

我猜測相關代碼片段已接近尾聲。

如果update沒有任何價值,我會通過致電finish()關閉該活動。這總是正常工作。

如果update的值存在,我會檢查更新標識符是否永遠不是最後存儲的值。如果更新標識符確實更新,我會顯示一個對話框。如果更新標識符不是新的,我嘗試通過調用finish()來關閉該活動,並繼續使用該應用程序。這第二個finish()調用從不起作用。

我應該注意到,我的模擬器似乎在第二個finish()調用上有一個小小的呃逆,但LogCat沒有提到任何錯誤,警告等。

爲什麼第二個finish()關閉我的活動?

+1

您確定您將LAST_UPDATE_MESSAGE_ID正確設置爲SharedPrefs嗎? – 2013-02-26 16:09:57

+0

我不認爲那裏有任何問題。在調試器中,我注意到當我有一個'update'對象並且updateId與lastId相等或更小時,第二個'finish()'被調用(使用斷點)。 – 2013-02-26 16:12:58

+0

所以你的問題是它被調用,但它沒有關閉活動,對吧? – 2013-02-26 16:19:00

回答

0

什麼情況下更新不爲空?在當前正在運行的活動下面是否有可能存在同一活動的第二個實例,因此最高活動實際上已完成,但看起來並不像它,因爲它返回的活動具有相同的佈局?

相關問題