BroadcastReceiverによるメモリリークが修正できた件。
時計アプリを作っていて、アラーム時刻をサービスに送ろうとしてBroadcastReceiverを使ったら、メモリリークが発生。しかしそれを何とか修正した件。
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_zoperation) //MyReceiverの登録 val filter1 = IntentFilter() filter1.addAction("this_is_alarm_time") registerReceiver(MyReceiver(), filter1) //ボタンを押すと findViewById(R.id.button).setOnClickListener{ //目覚まし時刻の入力(4桁の数字を入力) val alarmTime:String = findViewById(R.id.inputAlarmTime) .text.toString() val intent = Intent("this_is_alarm_time").apply { putExtra("alarmTime", alarmTime) } sendBroadcast(intent) } } }受け側はこんな感じ。
var alarmTime2: String = "" class MyService : Service() { //MyReceiverをここに置く。 class MyReceiver: BroadcastReceiver() { override fun onReceive(p0: Context?, intent: Intent?) { alarmTime2 =intent?.getStringExtra("intAlarmHour")? } } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager //以下、alarmTime2を使って、目覚ましの設定を行う。 }ところがこれでは、最初のMainActivityでメモリリークが起きてしまう。
これをなくすには、MainActivityを変える必要がある。つまり、レシーバーをnull許容型にしてonCreateよりも前にクラス全体の変数として定義し、最初はnullとしておく。そして、最後にonDestroyの中でunregisterRceiverを呼んで解放する。
class MainActivity : AppCompatActivity() { var myReceier:MyService.MyReceiver? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_zoperation) //MyReceiverの登録 val filter1 = IntentFilter() filter1.addAction("this_is_alarm_time") myReceiver = MyService.MyReceiver() registerReceiver(myReceiver(), filter1) //ボタンを押すと findViewById(R.id.button).setOnClickListener{ //目覚まし時刻の入力(4桁の数字を入力) val alarmTime:String = findViewById(R.id.inputAlarmTime) .text.toString() val intent = Intent("this_is_alarm_time").apply { putExtra("alarmTime", alarmTime) } sendBroadcast(intent) } } override fun onDestroy(){ super.onDestroy() unregisterReceiver(myReceiver) } }しかしこれがわかるまでにだいぶ時間がかかってしまった。 https://qiita.com/toastkidjp/items/c1bd3306adababfad254 こちらのページを参考にさせてもらって、解決できました。 ありがとうございました。
コメント
コメントを投稿