2011-06-20 7 views
2

私は、プロセスの一部としてウェブサイトからデータを取得するAndroidアプリを開発しています。そのデータの一部は画像です。私はデータをキャッシュします。私はバックグラウンドでこれを行う必要があることを知っていますが、これについてどうやって行くのか混乱しています。私はバックグラウンド部分があらゆるアクティビティからアクセスできるようにしたい。私はバックグラウンドで実行されているサービスにこの機能を組み込む必要があると思います。新しいスレッドを作成する必要がありますか、それとも暗黙のうちにサービスで行うことはできますか?バックグラウンドワークサービス、スレッド、または両方

私はHandlerとLooperの使い方を読んでいます。これらはサービスに統合する必要がありますか?または、私はそれらを使うべきですか?

編集:

多分私は本当に明確ではありませんでした。私は自分のデバイスに表示されるウェブページからデータを取得したい。私は有望に見えるが、いくつかの欠点があった "レイジーリスト"画像の読み込みの例を見つけた。一度に1つずつダウンロードしたイメージのキューを設定し、リストビューを更新しました。それは単なるスレッドだった。

それは少し無意味になり、画像ごとにこれらの新しいものを作るように思えます。私はそれを変更して、複数のアクティビティからのアクセスを許可しようとしています。私はまた、適切な構成を使用したい。これを読むために、ルーパーとハンドラーがこのために設計されたようです。

+0

キャッシュとはどういう意味ですか?静的マップに配置し、外部ストレージに情報を書き込んでバックアップするのはなぜですか?どれくらいのデータについて話していますか? – Kaj

+0

主にかなり小さい画像でなければなりません。しかし、彼らはウェブから来て、蓄積するかもしれません。 – SSMI

答えて

1

あなたは、いくつかの要件があるようです:インターネット

  • から適度な量のデータが背景
  • 使用複数のアクティビティ間で、このデータに動的にこのデータを取得

    1. キャッシュを
    2. 複数の同時リクエストを処理できるようにする

    ポイント2では、別のスレッドが必要であることが示唆されていますUIスレッドのパフォーマンスに影響を与えたくない場合は、ポイント3はあなたにサービスが必要であることを示唆しています。ポイント1と4は、ある種のキューが役に立つかもしれないことを示唆しています。

    これらを組み合わせたクラスは、IntentServiceです。それを見てみましょう。基本的には、ワーカースレッドのバックグラウンドで要求をキューに入れて処理します。すべてのインターネットデータであるため、URIを含むインテントを渡すだけで、IntentServiceをダウンロードすることができます。あなたはおそらくResultReceiverをインテントとともに渡して、ダウンロードが完了したらそのURIを終了したアクティビティに戻ってくるようにすることができます。

  • +0

    これは私にとってはほとんど理想的で、一般的に答えです。しかし、周りを見回した後、私はHandlerとLooperでサービスを使うことに決めました。そこで、私は優先順位を制御して、もう少しコントロールすることができます。 – SSMI

    +0

    それは確かに妥当です。 'IntentService'実装を見れば、それはあなたが概説したものです:ハンドラとルーパーを持つサービスです。 – kabuko

    +0

    どのようなタスクをどのような順序で実行しても管理することはできません。 – SSMI

    1

    具体的なユースケースは何ですか?アプリケーションが表示されているかどうかにかかわらず、いくつかの画像をプリロードするには、サービスを検討する必要があります。

    あなたは自分の現在の活動にロードされている画像をキャッシュしたい場合は、AsyncTaskは、より良い選択かもしれません。

    いずれの場合でも、キャッシュされたイメージを永続ストア(キャッシュディレクトリまたはSQLLite)に保存して、どのアクティビティでも使用できるようにします。

    1

    プロセスがどのように「バックグラウンド」になっているかによって異なります。ユーザーが知らなくてもウェブサイトからデータを取得するには、Service + AsyncTaskを使用する必要があります(デフォルトでは、ServiceはUIと同じスレッド/プロセスで実行されるため、まだAsyncTaskが必要です) - 別のスレッドを使わずに長時間実行しているタスクを実行すると、UIスレッドがブロックされ、かなり厄介になります)。

    ただし、このアプローチは他の頭痛につながります。たとえば、サービスを開始する方法を見つける必要があります。AlarmManagerを定期的に使用したり、他の仕組みを見つけたりします(ブロードキャストの意図を聞くなど)。

    異なる方法は、Activityにデータをロードし、ユーザーに読み込みメッセージを表示することです(ProgressDialogを参照してください)。このようにして、ユーザーは自分が行っていることを知ることができ、非常に簡単に「リフレッシュ」機能を実装することができます。

    どちらの場合も、保存オプションはかなりあります。次のことが可能です。

    • 場合、あなたはキャッシュディレクトリ/ SDカードに直接取得するファイル(ContextgetCacheDir()をチェックしてください)
    • は、あなたが(たとえばJSON/XML)を解析しない店あなたはにシリアライズされたオブジェクトを格納することができますキャッシュディレクトリ/ SDカードあなたがsqliteのデータベースを使用することができます
    • 再びそれらを解析する必要はありませんので(アンドロイドのdevのサイト上のドキュメントやチュートリアルがある)

    その後、あなたはに格納されたデータを使用することができますアプリケーションコンポーネント(アクティビティ、サービス、e 。TC)