Android Studio中Java编写的DicomViewer启动新Activity崩溃问题求助
修复方案
- 修正布局加载错误
你在dicomImageView.java的onCreate方法中错误加载了R.layout.activity_main,而你的DICOM预览布局文件为activity_dicom_image_view.xml,修改对应代码:
- 修正布局加载错误
// 错误写法 // setContentView(R.layout.activity_main); // 正确写法 setContentView(R.layout.activity_dicom_image_view);
加载错误布局会导致findViewById返回空值,后续操作触发空指针崩溃,且页面只会显示默认布局内容。
- 修复逻辑触发链路
你已经直接从RoomDetailFragment将DICOM文件Uri通过Intent的setData传入dicomImageView,不需要再通过ActivityResultLauncher跳转其他页面拿数据,直接在onCreate中读取传入的Uri执行解析逻辑即可,在onCreate的控件初始化后添加以下代码:
- 修复逻辑触发链路
Uri incomingUri = getIntent().getData(); if (incomingUri != null) { doSomeOperations(getIntent()); }
原代码中仅注册了返回结果监听但从未触发跳转,所以解析逻辑永远不会执行,ImageView只会显示默认设置的红色背景。
- 修正DICOM数据集加载参数
原代码DataSet loadDataSet = CodecFactory.load(String.valueOf(intent));参数完全错误,String.valueOf(intent)会返回Intent对象的序列化字符串,不是文件数据源。结合你已经实现的管道读取逻辑,修改为从管道读取端加载数据集:
- 修正DICOM数据集加载参数
// 原错误代码删除 // DataSet loadDataSet = CodecFactory.load(String.valueOf(intent)); // 新增代码:等待推送线程完成数据写入 try { pushThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } // 从管道读取端加载DICOM数据集 StreamReader streamReader = new StreamReader(imebraPipe.getStreamInput()); DataSet loadDataSet = CodecFactory.load(streamReader);
- 修正Intent传参的MIME类型
Kotlin跳转代码中setDataAndType的第二个参数传入.DCM不符合MIME格式规范,修改为标准DICOM类型:
- 修正Intent传参的MIME类型
// 错误写法 // setDataAndType(action.uri, dicom_) // 正确写法 setDataAndType(action.uri, "application/dicom")
- 可选优化
跳转Intent不需要添加FLAG_ACTIVITY_NEW_TASK标记,同应用内启动Activity无需该配置,移除即可避免非预期的栈行为。
- 可选优化
内容的提问来源于stack exchange,提问作者SuperAfsd
相关产品推荐
相关产品推荐

