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

调用Activity方法填充ListView时应用崩溃,求排查解决

问题分析与修复方案

让我帮你拆解下这个崩溃的核心问题,从你的代码逻辑和调用方式来看,主要有几个违背Android开发规范的地方,这也是导致崩溃的根源:

1. 跨Activity直接调用方法的风险

你直接把context强转为FichaActivity来调用方法,但这个context对应的Activity实例很可能处于非活跃状态(比如还没执行onCreate,或者已经被系统回收),这种强转不仅不安全,还完全违背了Android的生命周期设计原则。

2. ListView初始化时机错误

createList()里直接调用findViewById获取ListView,但如果此时FichaActivity还没执行setContentView(比如你在另一个Activity刚启动FichaActivity就调用这个方法),listViewF会返回null,后续调用setAdapter()就会触发NullPointerException——这大概率是你看到"应用停止运行"的直接原因。

3. 数据库与Cursor的资源泄漏问题

你的retrieveList()方法里,db和cursor都是成员变量,但没有做任何关闭或释放处理,长期下来会造成内存泄漏,甚至触发数据库锁死的问题。另外你提供的日志E/libprocessgroup: failed to make and chown /acct/uid_10060并不是崩溃的核心日志,真正的崩溃日志应该在AndroidRuntime标签下,比如空指针异常的堆栈信息。


具体修复方案

推荐方案:用Intent传递信号,让FichaActivity自主加载列表

跨Activity直接调用方法是非常不推荐的做法,正确的方式是通过Intent传递"需要刷新列表"的信号,让FichaActivity在合适的生命周期(比如onResume)里自行处理:

在调用方Activity中:

Intent intent = new Intent(this, FichaActivity.class);
intent.putExtra("REFRESH_LIST", true);
startActivity(intent);
finish();

然后在FichaActivity中接收信号并处理:

@Override
protected void onResume() {
    super.onResume();
    // 检查是否需要刷新列表
    if (getIntent().getBooleanExtra("REFRESH_LIST", false)) {
        loadAndShowList();
        // 移除标记,避免重复加载
        getIntent().removeExtra("REFRESH_LIST");
    }
}

// 把retrieveList和createList合并成一个方法,保证逻辑连贯性
private void loadAndShowList() {
    // 先关闭旧的cursor和db,避免泄漏
    if (cursor != null && !cursor.isClosed()) {
        cursor.close();
    }
    if (db != null && db.isOpen()) {
        db.close();
    }

    // 加载数据
    DataBaseAdapter dbAdapter = new DataBaseAdapter(this);
    db = dbAdapter.getWritableDatabase();
    cursor = db.rawQuery("SELECT * FROM ficha", null);

    // 初始化ListView并设置适配器
    ListView listViewF = findViewById(R.id.listViewF);
    CursorAdapterList adapter = new CursorAdapterList(this, cursor);
    listViewF.setAdapter(adapter);
}

// 在Activity销毁时释放所有资源
@Override
protected void onDestroy() {
    super.onDestroy();
    if (cursor != null && !cursor.isClosed()) {
        cursor.close();
    }
    if (db != null && db.isOpen()) {
        db.close();
    }
}

临时修复(不推荐):如果一定要保持原调用方式

如果你暂时不想改调用逻辑,至少要做以下修正来避免崩溃:

  1. 在FichaActivity中添加视图初始化标记:
private boolean isViewReady = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_ficha_activity_layout); // 确保这里已经加载布局
    isViewReady = true;
}
  1. 修改createList()方法,先检查视图是否初始化完成:
public void createList() {
    if (!isViewReady) {
        return; // 或者抛异常提示视图未准备好
    }
    listViewF = findViewById(R.id.listViewF);
    CursorAdapterList adapter = new CursorAdapterList(this, cursor);
    listViewF.setAdapter(adapter);
}
  1. 补充资源释放逻辑(和推荐方案中的onDestroy一致)

额外提示

你可以打开Android Studio的Logcat,过滤AndroidRuntime标签,找到真正的崩溃堆栈信息,这能帮你更精准地定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:52:02