3

SQLiteデータベースにキャッシュされているリモートデータをWebViewに表示するアプリケーションを構築しています。データは、JavaScriptインターフェースを介してWebViewからJavaScript関数によって要求されています。

ユーザーがページの入力要素に入力すると、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

アプリがクラッシュしたとき、エントリは1つだけです

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 に答える