私のアプリでは、約400MiBのHTMLドキュメントをダウンロード、処理、保存する必要があります(SQLiteで)。問題は、それだけのデータをsqliteに挿入する(約60kの挿入)のに非常に長い時間がかかることです。トランザクションとプリコンパイル済みステートメントを使用していますが、それでもかなりの時間がかかります。ローエンドの電話では、最大2時間かかる場合があります。ハイエンドのものでは、少なくとも10〜12分です。
これはすべてで行われるIntentService
ため、アプリがバックグラウンドにある間も続行できます。マニフェストで最も要求することを高速化するlargeHeap
ために、VMで使用可能なメモリに基づいてトランザクションサイズを設定します。これのおかげで、サービスは簡単に100MiBのRAMを使用できます。このため、アプリがバックグラウンドに入った直後にサービスが強制終了/一時停止されます。で使用startForeground
しService
てダウンロードの進行状況を表示しますが、役に立ちません。
これは、HTC One Xのようなハイエンドの電話でも、このプロセス中にシステムに200MiBを超える空きRAMがある場合でも発生します。
このメモリを大量に消費するサービスがシステムによって強制終了されないように保護する方法はありますか?現在、プロセスは再起動し、1つのセグメントがループで処理されているように見えます。これは、システムがそのセグメントを終了する前に強制終了するためです。トランザクションサイズを小さく設定すると、メモリ消費量は減少しますが、時間が倍増します。ハイエンドの電話では25分を超えることはできません。
編集: これは主にAndroid4以降で発生します。Android2.3.3ははるかに安定しているように見えます。