gpt4 book ai didi

java - Android 应用程序无异常退出

转载 作者:太空狗 更新时间:2023-10-29 14:23:54 28 4
gpt4 key购买 nike

我正在构建一个应用程序,它在 WebView 中显示一些缓存在 SQLite 数据库中的远程数据。 JavaScript 函数通过 JavaScript 接口(interface)从 WebView 请求数据。

当用户在页面上的输入元素中键入内容时,JavaScript 函数通过调用 Java 函数请求搜索结果,Java 函数又会触发 sql 查询。然后将结果以合适的 JSON 格式打包并返回。

除非您输入的速度非常快,否则获取数据工作正常。如果您在按几下键后输入足够快,应用程序将没有抛出任何异常退出,它只会返回主屏幕。

我已经设法缩小了原因 - 注释掉对 .query 方法的调用可以防止崩溃,但会使应用程序无用。

有没有办法检查导致应用程序退出的原因,是否有其他日志或工具可以提供帮助?

Java函数代码:

    public Lot[] getLotList(String query, int limitCount) {
...
...
String[] resultColumns = new String[] { LotsSearch._ID };
String queryWhere = LotsSearch.TABLE_NAME + " MATCH ?";
String[] queryArgs = new String[] { query + "*" };
String sortOrder = LotsSearch.COLUMN_NAME_NUMBER + " ASC, " + LotsSearch.COLUMN_NAME_TITLE + " ASC";
String limit = null;
Cursor cursor = null;
if (limitCount != -1)
limit = "0," + limitCount;
try {
cursor = mDb.query(LotsSearch.TABLE_NAME, resultColumns, queryWhere, queryArgs, null, null, sortOrder, limit);
if (cursor != null && cursor.moveToFirst()) {
result = new Lot[cursor.getCount()];
try {
int idColumnIndex = cursor.getColumnIndexOrThrow(LotsSearch._ID);
int lotId;
Lot lot;
do {
lotId = cursor.getInt(idColumnIndex);
lot = mLots.get(lotId);
if (lot != null)
result[index++] = lot;
} while (cursor.moveToNext());
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
} catch (SQLiteException e) {
e.printStackTrace();
} finally {
if (cursor != null)
cursor.close();
}
...
...
return result;
}

更新:

我发现还有另一个日志可以通过发出来访问

logcat -b events

当应用程序崩溃时,只有一个条目

I/am_proc_died(   59): [11473,com.example.app] 

当应用程序正常退出时,此日志会显示一组条目:

I/am_finish_activity(   59): [1157978656,22,com.example.app/.MainActivity,app-request]
I/am_pause_activity( 59): [1157978656,com.example.app/.MainActivity]
I/am_on_paused_called(11473): com.example.app.MainActivity
I/am_destroy_activity( 59): [1157978656,22,com.example.app/.MainActivity]

最佳答案

我会更改我的自动搜索功能。即,仅当用户在约 1/2 秒内未按下任何键时才执行搜索。

如果您打字速度很快,那么这个函数会在其自身之上执行多次,甚至在结果能够返回之前。同时,您可能同时使用了太多游标资源,导致应用程序完全失败。


更新。如果你考虑一下,连续相当快地键入 10 个键可能意味着你有 10 个不同的查询正在执行和解析结果......如果它旋转多个线程,实际调用 getLotList 方法的代码肯定会出现一些死锁问题尝试更新用户界面。这可能会导致一些程序干脆放弃幽灵,不知道该做什么,甚至不知道该在哪个线程上报告问题。

当然,所有这些都很难从我们拥有的小 fragment 中分辨出来。

关于java - Android 应用程序无异常退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14131999/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com