10

Android robospice ライブラリがアクティビティのライフサイクルを管理する方法についての技術的な回答を探しています。開始ページから:

https://github.com/octo-online/robospice/wiki/Starter-Guide

「Activity (または他のコンテキスト) の内部クラスとして、UI を更新する RequestlListener を追加します。メモリ リークについて心配する必要はありません。RoboSpice がアクティビティのライフ サイクルを管理します。」

私の質問は、ローテーション後、アクティビティが破棄されて新しいインスタンスとして再作成された後でも、正しいコンテキストで正しいリスナーを呼び出すことができるように、robospice がリクエスト リスナーを自動的に更新する方法を教えてください。

ソース コードのリバース エンジニアリングを試みましたが、まだ答えが見つかりません。

https://github.com/octo-online/robospice

4

2 に答える 2

9

@テイクチャンスメイクチャ。あなたの言っていることは完全に正しいです。RS は、ネットワーク リクエストとアクティビティのライフ サイクルを管理するという明確な必要性を念頭に置いて設計されています。

@craigrs84。基本的に、RS では、リクエストが処理されているときに、関連するアクティビティが有効である限り、そのリスナーが呼び出されます。アクティビティが停止すると、そのすべてのリスナーが RS から切り離され、通知されなくなります。

RS の主な目的は、メモリ リークがないことを確認することです。アクティビティが終了する必要がある場合は、終了してガベージ コレクションが行われます。RS は、ガベージ コレクションを妨げるハード参照を保持していません。これこそが、RoboSpice の背後にある核となるアイデアです。

アクティビティの新しいインスタンスを保留中のリクエストに再プラグインする場合 (たとえば、リクエストを実行し、デバイスを回転させてからアクティビティの新しいインスタンスを取得し、その新しいインスタンスにリクエストの結果を受信させたい場合)前のインスタンスによって実行されます)、これは RS で可能です。

spiceManager.addListenerIfPendingこのような場合は、 spiceManager.start(..) を呼び出した直後の起動時にメソッドを使用します。これは新しいリクエストを実行しませんが、新しいリスナーを保留中のリクエストに再接続します。保留中のリクエストがない場合は、何もしません。

于 2013-10-11T09:16:22.793 に答える
2

私の経験からの短い答えは、そうではないということです。

たとえばSpiceManager.shouldStop()、リクエストを呼び出して実行しない場合、RequestListener への参照は引き続き保持され、Activity/Fragment/Service がなくなった場合にその中で参照されているものを更新しようとするため、メモリ リークが発生する可能性があります。存在します。

于 2013-10-01T19:38:10.957 に答える