0

過去6時間、次の問題に頭を悩ませようとしてきましたが、理解できません。簡単に修正できる問題だと思いますが、どういうわけかそうではありません。

いくつかの完了ハンドラーを持つAsync HTTP ライブラリを使用します。そのうちの 1 つは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":"j.dielemans@live.nl","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 */
            }
        }
    }
}

関連するコードは終わりに近いと思います。

I に値がない場合は、updateを呼び出してアクティビティを閉じfinish()ます。これは常に正常に機能します。

の値がupdate存在する場合、更新識別子が最後に保存された値ではないかどうかを確認します。更新識別子が実際に新しい場合は、ダイアログを表示します。更新識別子が新しくない場合は、呼び出してアクティビティを閉じfinish()、アプリを続行しようとします。この 2 番目finish()の呼び出しは機能しません。

私のエミュレータは、この 2 回目のfinish()呼び出しで小さな問題が発生しているように見えますが、LogCat はエラーや警告などについて言及していません。

finish()2 番目にアクティビティが閉じられないのはなぜですか?

4

1 に答える 1

0

update が null でないのはどのような状態ですか? 現在実行中のアクティビティの下に同じアクティビティの 2 番目のインスタンスがある可能性があります。そのため、一番上のアクティビティは実際には終了していますが、返されるアクティビティが同じレイアウトであるため、そのようには見えませんか?

于 2013-02-26T21:26:48.270 に答える