ANDROID,改型:在API调用过程中按下后退按钮会使应用程序崩溃

ANDROID,改型:在API调用过程中按下后退按钮会使应用程序崩溃,android,retrofit2,Android,Retrofit2,我正在进行改造,以便在我的android应用程序中调用RESTAPI。要调用API,我使用类似以下代码: private void saveAddress(){ // check if internet is available if(InternetUtil.getInstance(getApplicationContext()).isOnline()) { if(validator.validate()) { showLoader();

我正在进行改造,以便在我的android应用程序中调用RESTAPI。要调用API,我使用类似以下代码:

private void saveAddress(){
    // check if internet is available
    if(InternetUtil.getInstance(getApplicationContext()).isOnline()) {
        if(validator.validate()) {
            showLoader();

            CustomerAPI customerAPI =
                    HttpClient.getClient().create(CustomerAPI.class);

            Call<HashMap<String, String>> call = customerAPI.createAddress(address);
            call.enqueue(new Callback<HashMap<String, String>>() {
                @Override
                public void onResponse(Call<HashMap<String, String>> call, Response<HashMap<String, String>> response) {
                    canGoBack = true;
                    HashMap<String, String> resultMap = response.body();

                    if (resultMap.get(Constant.CREATE_OPERATION_RESPONSE_KEY).equals(Constant.ADDRESS_CREATED_RESPONSE_VALUE)) {
                        hideLoader();
                    }
                }

                @Override
                public void onFailure(Call<HashMap<String, String>> call, Throwable t) {
                    System.out.println(t.getMessage());
                }
            });
        }
    }else{
        DialogUtil.showNoInternetDialog(this);
    }
}
问题是,当我点击SaveAddress按钮时,API被调用。如果中间有人按下硬件后退按钮,我的应用程序就会崩溃

一种处理方法是引入一个布尔变量,如canGoBack。在调用API之前,我可以将其设置为false,在收到响应之后,我可以将其设置为true。 然后我必须像这样更换goBack:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        goBack();
        return true;
    }

    return false;
}

/**
 * Go back to previous activity
 */
private void goBack(){
    Intent intent = new Intent(AddAddressActivity.this, AddressListActivity.class);

    startActivity(intent);
    finish();
}
private void goBack(){
    if(canGoBack){
        Intent intent = new Intent(AddAddressActivity.this, AddressListActivity.class);

        startActivity(intent);
        finish();
    }
}
我觉得上面的代码不符合最佳实践(只有jugaad),必须有更好的方法来做到这一点


另外,当有人在调用过程中按下home按钮时?

这是因为API调用是异步执行的。当调用API时屏幕被关闭时,调用仍在执行,响应在类的
onResponse
方法中获得。当活动被销毁时,它将具有空值。尝试在
onBackPressed
方法中取消API调用。更好的方法是在
onStop
方法中使用此代码

if(call!=null)
call.cancel()

这不是你处理后退按钮的方式。您可以按Backpress。另外,在没有发布完整堆栈跟踪的情况下,不要发布“thishcrasted”。此外,你的想法完全是倒退的。您不会因为某个API调用挂起而阻止用户返回。实际上,我还有一个后退按钮,单击该按钮也会调用goBack,我还将对堆栈进行后期跟踪。一旦按下了onback,则这两个按钮都会调用goBack。但是你仍然不能把back按钮当作一个普通的硬件按钮来对待。试着不要在back press时调用intent,而是在finish时调用onBackPressed。