【问题标题】:Impossible to dismiss BottomSheetDialogFragment programmatically from AsyncTask after screen rotation屏幕旋转后,无法以编程方式从 AsyncTask 关闭 BottomSheetDialogFragment
【发布时间】:2018-07-08 03:39:14
【问题描述】:

我已经寻找任何可能的类似问题,但没有一个与此问题相关,因此不提供此问题的解决方案。

我有一个基本的聊天实现设计,其中用户从ChatFragment 打开一个BottomSheetDialogFragment

这个BottomSheetDialogFragment负责要求用户确认他要上传选择的文件,并在确认后显示上传进度。

上传完成后,BottomSheetDialogFragment 会自动关闭。

如果用户在上传过程中不旋转屏幕,一切都会完美运行。

在上传过程中旋转屏幕时会出现此问题。

在上传过程中,屏幕旋转,上传完成,AsyncTask调用BottomSheetDialogFragment设置的Complete监听器。

当调用BottomSheetDialogFragment Complete 监听器时,它只是执行dismiss() 方法,但此时会抛出NPE,因为BottomSheetDialogFragment 不再附加到任何活动。

我正在寻找一种不涉及使用 setRetainInstance(true)(我失去对 AsyncTask 的引用)或更改清单中的 configChanges 选项的解决方案。

到目前为止,我已经尝试使用所有可用的片段管理器尝试从堆栈中弹出BottomSheetDialogFragment,但由于它不再附加到活动,所有片段管理器都是空的。我还尝试将它从ChatFragment 中删除,因为它包含对对话框的引用,但存在同样的问题。感觉好像AsyncTask“分离”上下文被传递给所有 Complete 侦听器,导致所有侦听器也与活动分离。

这是评论中要求的代码:

ChatFragment

public class ChatFragment extends Fragment { // That's the v4.support fragment

    (...)

    @Override
    public void onActivityResult(int requestCode, int resultCode, final Intent data) {

        if (resultCode == RESULT_OK) {

            final FragmentActivity activity;

            if ((activity = getActivity()) != null) {

                final BottomSheet BottomSheet = new BottomSheet();


                final OnFileUploadCompleteListener onFileUploadCompleteListener = new OnFileUploadCompleteListener() {
                    @Override
                    public void onComplete() {
                        bottomSheet.dismiss(); // tried just dismiss(); as well, makes no difference if it is dismissed from this class or from the BottomSheet itself
                    }
                };

                bottomSheet
                        .setOnFileUploadCompleteListener(onFileUploadCompleteListener)
                        .show(activity.getSupportFragmentManager(), bottomSheet.getClass().toString());

            }

        }

    }

    (...)

}

BottomSheet

public class BottomSheet extends BottomSheetDialogFragment implements FileUploadTask.OnUploadCompleteListener {

    // the file upload task is initiated when the user confirms the upload

    (...)

    @Override
    public void onUploadComplete(String response) {

        if (onFileUploadCompleteListener != null) {
            onFileUploadCompleteListener.onComplete();
        }

        dismiss();

    }


    public BottomSheet setOnFileUploadCompleteListener(OnFileUploadCompleteListener onFileUploadCompleteListener) {
        this.onFileUploadCompleteListener = onFileUploadCompleteListener;
        return this;
    }


    public interface OnFileUploadCompleteListener {
        void onComplete();
    }

    (...)

}

FileUploadTask

public class FileUploadTask extends AsyncTask<File, Integer, String> {

    private OnUploadCompleteListener onUploadCompleteListener;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(File... fileUploadDataParams) {

        (miscellaneous file upload code)

        return response;

    }

    @Override
    protected void onPostExecute(String response) {
        super.onPostExecute(response);
        if (onUploadCompleteListener != null) {
            onUploadCompleteListener.onUploadComplete(response);
        }
    }

    public FileUploadTask setOnUploadCompleteListener(OnUploadCompleteListener listener) {
        onUploadCompleteListener = listener;
        return this;
    }

    public interface OnUploadCompleteListener {
        void onUploadComplete(String response);
    }

}

【问题讨论】:

  • 您能添加您的代码吗?
  • @Mosius 当然,我会立即添加它们
  • @Mosius 问题现已更新为代码 sn-ps
  • 完成您需要的最佳解决方案是使用viewModel
  • A DataBinding 模型已成功用于在旋转后恢复状态,我看不出 ViewModel 将如何防止发生分离的活动状态,因为它只存储 UI 相关数据。

标签: android android-asynctask


【解决方案1】:

我最终通过将 AsyncTask 和附加到其侦听器的类之间的通信层抽象化,将它们移动到 LocalBroadcast 接收器。通过这种方式,AsyncTask 不再向侦听器“泄露”活动分离状态。

此外,我注意到上传可能是一项长时间运行的任务,因此我完全放弃了 AsyncTask 并移至 IntentService。

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多