저는 지난 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()
내 활동을 닫지 않습니까?
LAST_UPDATE_MESSAGE_ID를 SharedPrefs로 설정 하시겠습니까? –
거기에 문제가 있다고 생각하지 않습니다. 디버거에서는'update' 객체가 있고 updateId가 lastId와 같거나 작은 경우 두 번째'finish()'가 (중단 점을 사용하여) 호출된다는 것을 알 수 있습니다. –
문제는 그것이 호출되고 있지만 활동을 종료하지 않는다는 것입니다. –