调用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(); } }
临时修复(不推荐):如果一定要保持原调用方式
如果你暂时不想改调用逻辑,至少要做以下修正来避免崩溃:
- 在FichaActivity中添加视图初始化标记:
private boolean isViewReady = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_ficha_activity_layout); // 确保这里已经加载布局 isViewReady = true; }
- 修改
createList()方法,先检查视图是否初始化完成:
public void createList() { if (!isViewReady) { return; // 或者抛异常提示视图未准备好 } listViewF = findViewById(R.id.listViewF); CursorAdapterList adapter = new CursorAdapterList(this, cursor); listViewF.setAdapter(adapter); }
- 补充资源释放逻辑(和推荐方案中的
onDestroy一致)
额外提示
你可以打开Android Studio的Logcat,过滤AndroidRuntime标签,找到真正的崩溃堆栈信息,这能帮你更精准地定位问题。
内容的提问来源于stack exchange,提问作者Alexandre

