从DialogFragment进行改造请求

时间:2014-10-28 03:25:31

标签: android retrofit

我在我的应用程序中实现了一个登录DialogFragment(API 19)。我使用Retrofit 1.7.1进行网络连接。实施如下:

public class SignInDialogFragment extends DialogFragment {
    private EditText mUsernameEditText;
    private EditText mPasswordEditText;

    public static SignInDialogFragment newInstance() {
        return new SignInDialogFragment();
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Builder builder = new AlertDialog.Builder(getActivity())
                .setPositiveButton(R.string.action_sign_in, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        String username = mUsernameEditText.getText().toString();
                        APIFactory.getAPI().register(username, new Callback<RegistrationResponseModel>() {
                            @Override
                            public void success(RegistrationResponseModel registrationResponse, Response response) {
                                Toast.makeText(getActivity(), "Totally worked!", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void failure(RetrofitError error) {
                                Toast.makeText(getActivity(), "Something failed!", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                })
                .setNegativeButton(R.string.action_cancel, null);

        View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_sign_in, null);
        builder.setView(view);

        mUsernameEditText = (EditText)view.findViewById(R.id.usernameEditText);

        return builder.create();
    }
}

正如您可能预测的那样,当getActivity()遇到空引用时,这会在成功或失败时崩溃。 处理异步请求的最佳方法是什么,包括在解除对话后获取回调?

我想到了几个选择;他们中的任何一个都可行吗?

如果有正在进行的请求,我可以简单地打开对话框。我还没有实现这个,因为我不确定保持对话的最干净方法(处理后退按钮等)。

我真的想在对话框关闭时取消请求,但我不能,因为there is not currently a way to cancel Retrofit requests

如果有一个我不知道的选项,我想听听它。

1 个答案:

答案 0 :(得分:4)

您应该将您的操作移出Dialog。对话框不是活动 - 一旦用户做出选择,对话框就应该被取消,如果有任何触发它的动作应该以响应对用户操作对话框进行,但它不应该是对话的一部分。因此,您应该只对父片段或活动中的用户选择做出反应,而不是在对话框中做出反应。