You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Java编写的DicomViewer启动新Activity崩溃问题求助

修复方案
    1. 修正布局加载错误
      你在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返回空值,后续操作触发空指针崩溃,且页面只会显示默认布局内容。

    1. 修复逻辑触发链路
      你已经直接从RoomDetailFragment将DICOM文件Uri通过Intent的setData传入dicomImageView,不需要再通过ActivityResultLauncher跳转其他页面拿数据,直接在onCreate中读取传入的Uri执行解析逻辑即可,在onCreate的控件初始化后添加以下代码:
Uri incomingUri = getIntent().getData();
if (incomingUri != null) {
    doSomeOperations(getIntent());
}

原代码中仅注册了返回结果监听但从未触发跳转,所以解析逻辑永远不会执行,ImageView只会显示默认设置的红色背景。

    1. 修正DICOM数据集加载参数
      原代码DataSet loadDataSet = CodecFactory.load(String.valueOf(intent));参数完全错误,String.valueOf(intent)会返回Intent对象的序列化字符串,不是文件数据源。结合你已经实现的管道读取逻辑,修改为从管道读取端加载数据集:
// 原错误代码删除
// 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);
    1. 修正Intent传参的MIME类型
      Kotlin跳转代码中setDataAndType的第二个参数传入.DCM不符合MIME格式规范,修改为标准DICOM类型:
// 错误写法
// setDataAndType(action.uri, dicom_)
// 正确写法
setDataAndType(action.uri, "application/dicom")
    1. 可选优化
      跳转Intent不需要添加FLAG_ACTIVITY_NEW_TASK标记,同应用内启动Activity无需该配置,移除即可避免非预期的栈行为。

内容的提问来源于stack exchange,提问作者SuperAfsd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:39:02