安卓(ANDROID),改进:在API调用过程中按返回按钮会使应用程序崩溃

时间:2018-07-25 03:49:09

标签: android retrofit2

我正在与Retrofit一起在我的android应用中调用REST API。要调用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);
    }
}

我这样处理硬件:

@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();
}

问题是,当我单击“保存地址”按钮时,将调用API。如果在两者之间有人按下硬件后退按钮,我的应用程序将崩溃。

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

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

        startActivity(intent);
        finish();
    }
}

我认为上述代码不是最佳做法(仅适用于jugaad),并且必须有一种更好的方法。

还有,当有人在通话过程中按下主屏幕按钮吗?

1 个答案:

答案 0 :(得分:1)

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

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