【问题标题】:Android application exits without any exceptionAndroid应用程序无异常退出
【发布时间】:2012-12-17 09:46:43
【问题描述】:

我正在构建一个应用程序,它在 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] 

【问题讨论】:

  • 没什么可发的,logcat 完全是空的(崩溃时没有添加一个条目),所以才问有没有其他的调试建议。
  • 您是否尝试过通过应用断点进行调试,只是问,愚蠢的问题
  • 是的,但是当应用程序死掉时,Eclipse 什么也抓不到(因为没有抛出异常)
  • 我会建议逐行调试,看看它在哪一行之后退出,会给你一个提示

标签: java javascript android sqlite android-webview


【解决方案1】:

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

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


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

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

【讨论】:

  • 谢谢,这是一个很好的解决方法,但让我担心的是应用程序在 logcat 中没有任何痕迹就失败了,所以整体设计可能有问题,我想不出任何办法来找出答案怎么了。顺便提一句。我没有那么快地打字 - 大约 10 次击键就足以让它退出,此时只有触发的查询来自该函数。
  • 剩下的代码很简单,JavaScript函数调用函数在Java接口中依次调用问题中列出的函数。所有 JavaScript 函数所做的只是在结果上调用 JSON.parse,并且接口函数正在打包问题中函数的结果。
猜你喜欢
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多