Android BroadcastReceiverを使用して注意すべき問題
1240 ワード
今天在 android 的 BroadcastReceiver 里面写一些代码的时候出现了意想不到的异常。情况是这样的:
当我在广播类里面这样定义一个Dialog,然后再在这个类里面调用dimiss方法时,对话框始终不消失,这让我纳闷了很久。。。
private ProgressDialog dialogDataUpload = null; private void dimiss() { if (dialogDataUpload != null) { dialogDataUpload.dismiss(); dialogDataUpload = null; } }
その後、このクラスのdimissメソッドをよく見ると、Eclipseには「This Handler class should be static or leaks might occur」という警告があり、BroadcastReceiverに関する以前に見た注意点をかすかに連想させた.その後、BroadcastReceiverについて詳しく知ると、そのライフサイクルは10秒程度であることが判明し、onReceive()内で10秒を超えることをすると、ANR(Application No Response)プログラムに応答しないエラーメッセージが通知され、比較的時間のかかる作業を完了する必要がある場合は、サービスにIntentを送信することで、サービスによって完了するべきである.BroadcastReceiverのライフサイクルが短いため、サブスレッドがまだ終了していない可能性があります.BroadcastReceiverは先に終了します.BroadcastReceiverが終了すると、BroadcastReceiverが存在するプロセスは、システムがメモリを必要とする場合に優先的に殺されやすくなります.これは、空のプロセス(アクティブなコンポーネントがないプロセス)であるためです.宿主プロセスが殺されると、動作中のサブスレッドも殺される.したがって,サブスレッドを用いて解決することは信頼できない.
この説明により、10秒以上の操作を行ったため、キャンセルダイアログの操作を実行したときにブロードキャストクラスのオブジェクトが破棄されたため、dimissメソッドが機能しないことが明らかになった.だから、私の解決策は、明示されたDialogの前にstatic属性を加えることです.これにより、放送のライフサイクルが終了すると、staticの属性によってdimiss法が機能します.もちろん最善の方法は前述の通りですが、比較的時間のかかる操作であれば、サービスを起動して処理したほうがいいです.