【问题标题】:Making Retrofit request from DialogFragment从 DialogFragment 发出改造请求
【发布时间】:2014-10-28 12:05:40
【问题描述】:

我在我的应用程序(API 19)中实现了登录 DialogFragment。我正在使用 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

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

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    您应该将您的操作移出 Dialog。对话框不是 Activity - 一旦用户做出选择,对话框应该被关闭,如果有任何动作触发它应该作为 response 对用户使用对话框的操作来完成,但它不应该是对话框的一部分。因此,您应该只在父 Fragment 或 Activity 中对用户选择做出反应,而不是在 Dialog 中。

    【讨论】:

    • 哦,我明白了。这更有意义。我可能会从其他几个地方调用这个逻辑,所以我应该将响应逻辑放入启动此对话框的 Fragment 中吗?
    • 没错。对话框只是为了从用户那里获得“反馈”,但主要操作的地方是它的父对象。
    • 太棒了!那么我将不得不阅读更多关于无头片段的信息......我仍然不完全确定如何处理有人离开活动,而有一个未完成的请求。我认为无头片段应该只注销callbacks 成员或类似的东西。
    • 您可以通过多种方式做到这一点 - 即您可以通过重载 onBackPressed() 来防止离开,但这是个坏主意。除非您完成,否则您可能希望显示锁定整个 UI 的不可关闭的进度对话框(或其他)。或者你可以标记那个用户离开你的片段/活动(即在onPause()中,当你完成异步任务时,你检查你是否仍然与用户界面“分离”(对于片段你也可以使用isAdded())和采取相应的行动。
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2015-11-20
    相关资源
    最近更新 更多