Android应用程序退出,没有任何异常

时间:2013-01-03 01:44:43

标签: java javascript android sqlite android-webview

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

当用户键入页面上的input元素时,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 个答案:

答案 0 :(得分:1)

我要更改自动搜索功能。即,如果用户没有按下键约1/2秒,则仅执行搜索。

如果您正在快速键入,那么此功能将在其自身之上执行多次,之后结果甚至可以返回。与此同时,您可能会有太多的光标资源一次性导致应用程序完全失败。


<强>更新即可。如果你考虑它,连续快速键入10个键可能意味着你有10个不同的查询执行和解析结果......如果它旋转多个线程,实际上调用getLotList方法的代码肯定会有一些死锁问题尝试更新UI。这可能导致一些程序只是放弃鬼不知道该做什么,甚至不知道要报告问题的线程。

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