【发布时间】: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 相关数据。