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]