1

メール データベースを大量に使用した後 (1000 件以上のメールがありました)、メール アプリがクラッシュしました。もう一度アプリに戻ると、すべてのメールが自動的に削除され始めました。

得られるエラーログは以下の通りです。

E/AndroidRuntime(  417): java.lang.OutOfMemoryError
E/AndroidRuntime(  417):    at java.lang.String.<init>(String.java:468)
E/AndroidRuntime(  417):    at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:659)
E/AndroidRuntime(  417):    at java.lang.StringBuilder.toString(StringBuilder.java:664)
E/AndroidRuntime(  417):    at com.android.email.mail.transport.DiscourseLogger.addReceivingLineToBuffer(DiscourseLogger.java:57)
E/AndroidRuntime(  417):    at com.android.email.mail.transport.DiscourseLogger.addReceivedByte(DiscourseLogger.java:70)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.readByte(ImapResponseParser.java:71)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.expect(ImapResponseParser.java:332)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.parseToken(ImapResponseParser.java:199)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.readToken(ImapResponseParser.java:165)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.readTokens(ImapResponseParser.java:141)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.readResponse(ImapResponseParser.java:92)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapStore$ImapConnection.readResponse(ImapStore.java:1491)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapStore$ImapFolder.fetchInternal(ImapStore.java:887)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapStore$ImapFolder.fetch(ImapStore.java:810)
E/AndroidRuntime(  417):    at com.android.email.MessagingController.synchronizeMailboxGeneric(MessagingController.java:898)
E/AndroidRuntime(  417):    at com.android.email.MessagingController.synchronizeMailboxSynchronous(MessagingController.java:396)
E/AndroidRuntime(  417):    at com.android.email.MessagingController.access$2(MessagingController.java:384)
E/AndroidRuntime(  417):    at com.android.email.MessagingController$2.run(MessagingController.java:372)
E/AndroidRuntime(  417):    at com.android.email.MessagingController.run(MessagingController.java:171)
E/AndroidRuntime(  417):    at java.lang.Thread.run(Thread.java:1096)

W/Database( 497): データベース /data/data/com.android.email/databases/EmailProvider.db のコンパイル済み SQL ステートメント キャッシュの最大サイズに達しました。つまり、キャッシュ内にこの SQL ステートメント用のスペースがありません: SELECT _id FROM Attachment WHERE messageKey=996。'?' を使用するように SQL ステートメントを変更してください。実際の値を使用する代わりに、bindargs の場合

上記のエラーが発生する動作を知りたいです。

最大キャッシュサイズを超えた場合、アンドロイドはどうするのでしょうか? そのための実装がどこで行われるかを教えていただければ、非常に役に立ちます。

4

2 に答える 2

0

これは別の問題です。このメッセージはすべてを示しています:「データベースのコンパイル済みSQLステートメントキャッシュの最大サイズに達しました」

基本的に、emaill アプリケーションはクエリでハードコードされた値を使用しています。代わりに、準備済みステートメントのみをキャッシュするために、準備済みステートメントを使用する必要があります。

それが役に立てば幸い。

于 2011-02-01T03:51:04.477 に答える
0

を使用して最大 DB サイズを設定する方法がありますsetMaximumSize

を使用してDBサイズをチェックするスレッドを持つことができ、getMaximumSizこれが以前に修正したDBサイズに近い場合。

次に、ローカル DB を SD カード上の DB にレプリケート (コピー) し、releaseMemory を使用してメモリを解放します。

于 2011-01-28T05:24:33.427 に答える