[解決済み】このHandlerクラスはstaticでなければリークが発生する可能性があります。IncomingHandler
2022-03-30 06:59:49
質問
Android 2.3.3のアプリケーションをサービス付きで開発しています。そのサービスの中で、Mainアクティビティと通信するために、このようなものを用意しています。
public class UDPListenerService extends Service
{
private static final String TAG = "UDPListenerService";
//private ThreadGroup myThreads = new ThreadGroup("UDPListenerServiceWorker");
private UDPListenerThread myThread;
/**
* Handler to communicate from WorkerThread to service.
*/
private Handler mServiceHandler;
// Used to receive messages from the Activity
final Messenger inMessenger = new Messenger(new IncomingHandler());
// Use to send message to the Activity
private Messenger outMessenger;
class IncomingHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
}
}
/**
* Target we publish for clients to send messages to Incoming Handler.
*/
final Messenger mMessenger = new Messenger(new IncomingHandler());
[ ... ]
}
そして、ここにも。
final Messenger mMessenger = new Messenger(new IncomingHandler());
というLintの警告が表示されます。
This Handler class should be static or leaks might occur: IncomingHandler
どういう意味ですか?
どのように解決するのですか?
もし
IncomingHandler
クラスが静的でない場合、そのクラスはあなたの
Service
オブジェクトを作成します。
Handler
オブジェクトはすべて共通のLooperオブジェクトを共有し、メッセージを投稿したり、読み込んだりします。
メッセージにはターゲット
Handler
メッセージキューにターゲットハンドラを持つメッセージがある限り、ハンドラはガベージコレクトされません。ハンドラが静的でない場合
Service
または
Activity
は、破棄されてもガベージコレクションされることはありません。
これは、少なくともしばらくの間は、メッセージがキューに留まっている限り、メモリリークにつながる可能性があります。これは、長時間遅延するメッセージを投稿しない限り、さほど問題にはなりません。
を作成することができます。
IncomingHandler
を静的にして
WeakReference
をサービスに追加します。
static class IncomingHandler extends Handler {
private final WeakReference<UDPListenerService> mService;
IncomingHandler(UDPListenerService service) {
mService = new WeakReference<UDPListenerService>(service);
}
@Override
public void handleMessage(Message msg)
{
UDPListenerService service = mService.get();
if (service != null) {
service.handleMessage(msg);
}
}
}
こちらをご覧ください ポスト 参考文献:Romain Guy
関連
-
[解決済み】com.android.ide.common.process.ProcessException: aaptの実行に失敗しました! どうすればいいですか?
-
[解決済み】java.lang.RuntimeException: アクティビティを開始できない ComponentInfo
-
[解決済み] [Solved] Error "File google-services.json is missing from module root folder. これがないとGoogle Services Pluginは機能しません" [重複]。
-
[解決済み】onCreateOptionsMenu(Menu メニュー)とは何ですか?)
-
[解決済み】Android Studioでused import文がunused import文に指定されるのはなぜ?
-
[解決済み】Bluestackの向きを変更する : ポートレート/ランドスケープモード
-
[解決済み] android.support.design.widget.FloatingActionButton クラスの展開に失敗しました。
-
[解決済み] BIOSのセキュリティ設定でVT-xを有効にする(お使いのコンピュータのドキュメントを参照)。
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み】警告。この AsyncTask クラスは静的であるべきで、さもなければリークが発生する可能性があります。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】このアクティビティでは、Theme.AppCompatテーマ(またはその子孫)を使用する必要があります。
-
[解決済み】Edit Textのandroid:ems属性とは何ですか?[重複しています]
-
[解決済み] カスタムアダプタからnotifyDataSetChangeが機能しない
-
[解決済み] 現在のテーマでスタイル 'coordinatorLayoutStyle' を見つけることができませんでした。
-
[解決済み】Android Studioでused import文がunused import文に指定されるのはなぜ?
-
[解決済み】Android Studio。Android.support.design.widget.FloatingActionButton クラスを膨らませるのにエラーが発生する。
-
[解決済み] Android Studioで「URIが登録されていません」と報告されるのはなぜですか?[クローズド]
-
[解決済み] Mockito lenient() を使用する場合
-
[解決済み] Xlint:deprecationを使用して再コンパイルする方法
-
[解決済み] Androidでユーザーの非アクティブを検出する方法