2013-02-26 2 views
0

저는 지난 6 시간 동안 다음 호를 감안하여 머리를 감싸려고 노력했지만 해결할 수 없습니다. 나는 그것을 고치는 것이 쉬운 문제 여야한다고 믿지만, 어떻게 든 그것은 아니다.성공 처리기의 첫 번째 finish()가 제대로 작동하고 second finish()가 수행되지 않습니다

중 하나 인 완료 핸들러가 여러 개있는 Async HTTP library을 사용합니다. 내 성공 처리기의 코드는 다음과 같습니다.

@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() 통화가 작동하지 않습니다.

필자의 에뮬레이터에는이 두 번째호출에서 작은 딸꾹질이있는 것 같지만 LogCat에는 오류나 경고 등이 언급되어 있지 않습니다.

두 번째 이유는 무엇입니까? finish() 내 활동을 닫지 않습니까?

+1

LAST_UPDATE_MESSAGE_ID를 SharedPrefs로 설정 하시겠습니까? –

+0

거기에 문제가 있다고 생각하지 않습니다. 디버거에서는'update' 객체가 있고 updateId가 lastId와 같거나 작은 경우 두 번째'finish()'가 (중단 점을 사용하여) 호출된다는 것을 알 수 있습니다. –

+0

문제는 그것이 호출되고 있지만 활동을 종료하지 않는다는 것입니다. –

답변

0

어떤 조건이 업데이트가 아닌가? 현재 실행중인 액티비티 아래에 동일한 액티비티의 두 번째 인스턴스가있을 수 있습니다. 따라서 맨 위 액티비티는 실제로 완료되지만 반환되는 액티비티가 동일한 레이아웃을 가지므로 보지 않습니다.