安卓应用程序没有任何异常退出

3
我正在构建一个应用程序,该应用程序在WebView中显示一些远程数据,这些数据被缓存在SQLite数据库中。JavaScript函数通过JavaScript接口从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] 

没有任何内容可以发布,logcat完全为空(在崩溃时间周围没有添加任何条目),这就是为什么我问是否有其他调试建议的原因。 - Swav
你有没有尝试通过设置断点进行调试?只是问一下,问题有点傻。 - Hussain Akhtar Wahid 'Ghouri'
是的,但当应用程序崩溃时,Eclipse 没有捕获到任何异常(即没有抛出异常)。 - Swav
我建议逐行调试,并查看在哪一行退出,这将给你一个提示。 - Hussain Akhtar Wahid 'Ghouri'
1个回答

1
我会对我的自动搜索功能进行更改。即,仅在用户大约半秒钟没有按键时执行搜索。
如果您打字速度很快,那么这个功能会在结果返回之前多次执行,同时您可能会有太多的光标资源,导致应用程序完全失败。

更新。如果您考虑一下,连续快速输入10个键可能意味着您有10个不同的查询正在执行和解析结果... 如果调用getLotList方法的代码在尝试更新UI时同时启动了多个线程,那么肯定会出现一些死锁问题。这可能导致一些程序放弃运行,不知道该怎么做,甚至不知道在哪个线程上报告问题。

当然,从我们拥有的小片段中很难判断所有这些情况。


谢谢,这是一个不错的解决方法,但我担心的是应用程序在logcat中没有任何痕迹就崩溃了,所以整体设计可能有问题,我想不出任何方法找出问题所在。顺便说一下,我打字并不快 - 大约10个按键就足以使它退出,此时仅从该函数触发查询。 - Swav
代码的其余部分相当简单,JavaScript函数调用Java接口中的函数,然后调用问题中列出的函数。所有JavaScript函数所做的就是在结果上调用JSON.parse,而接口函数则将问题函数的结果打包。 - Swav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接