私はService
を持っています。これは私のアプリが起動するとバックグラウンドで実行され、アプリが終了した後も引き続き実行されます。それは登録Uri
のLoader.OnLoadCompleteListener<Cursor>
のContent Provider
からのimplements
です。新しいCursor
オブジェクトは、コールバックメソッドonLoadComplete(Loader<Cursor> loader, Cursor data)
に配信されると私はその後Parcelable
interface
を実装するカスタムObjects
のArrayList
を作成するためにCursor
を使用してAsyncTask
を実行します。一度処理されると、アプリケーションが開かれていれば、Handler
(Messenger
,Messages
、Bundle
)を使用してIPCフレームワークを使用してマーシャリング/デマーシャルされたアプリケーションに返信されます。アプリケーションが開いていない場合、ArrayList
は開かれたときにService
に呼び出されたアプリケーションを一度開いた状態に戻す準備ができています。Androidの例外:FAILED BINDER TRANSACTION
問題:
ArrayList
が比較的大きく得ることができます(それが唯一のPrimitives
と、いくつかの短いString
オブジェクトBitmaps
を含まない)と膨大な量がArrayList
は約700になったとき、それはFAILED BINDER TRANSACTION
を打つ意味オブジェクト。
現在のソリューション
私はチャンクにArrayList
を分割し、それがその後のAppで1 ArrayList
に再構成して使用されるHandler
に戻っていくつかのMessages
を送信しています(更新(つまり、ハックビットを感じています) RecyclerViewsなど)。
パフォーマンスが大幅に改善されたため、このアプローチを使用します。アプリケーションが開かれるたびに常にContent Provider
を照会するのではなく、最初にApp/Serviceが開始されたときに初めてクエリを実行するだけです。
私は 'ハッキー'と言う理由は、解決策ではなくBinder Framework
という制限の回避策のように感じるからです。
これに違う方法でアドバイスすることは歓迎されます。
お返事いただきありがとうございます。両方のアイデアは非常に妥当です。私は静的なArrayListを使うことを考えましたが、スコープの理由から静的変数を避けようとしました。この場合、他のスレッドがアクセスして同時に変更しようとするグローバル変数にアクセスします。私はおそらく、SQLデータベースに行くか、まったく別のアプローチを使用して再起動します。 –
私は第2のアプローチにも行くと思いますが、私はあなたの観察に同意します。私も興味がある別の答えを得ることができれば興味深いでしょう。 – z3n105
私は別のアプローチをとることに決めました - 私はカスタムAsyncTaskLoaderを使用します - これは、正しく実装されていれば、私は後の安定性を提供する必要があります。このインスタンスのデータベースを使用すると、プロセスを倍増させるように感じます。つまり、コンテンツプロバイダにクエリを行い、自分のデータベースにデータを挿入すると、プロセスを倍増させるように感じます。データベースを再度クエリし、カスタムPOJOオブジェクトはとにかくそれを形成する。 –