3

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

当用户在页面上输入一个输入元素时,JavaScript 函数通过调用 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] 
4

1 回答 1

1

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

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


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

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

于 2013-01-03T01:50:06.897 回答