Androidプロジェクトでは、コードを繰り返し実行したり、一定期間後に実行したりする方法が必要になることがあります。標準的な方法としては、ハンドラクラスを使用する方法がありますが、これはアプリのメモリリークにつながる可能性があります。この記事では、この問題に対するサードパーティの簡単な解決策を見てみましょう。

この記事が答える質問

  1. コードの一部を繰り返し実行するにはどうすればいいですか?
    1. 一定時間後にコードを実行するにはどうすればいいですか?

(a) 解答 1: every-after を使う。

メモリリークを気にせず、特定の時間が経過した後にタスクを実行する(任意で繰り返し実行する)Androidライブラリです。

every-after は、特定の時間が経過した後にコードの一部を(任意で繰り返し)実行するためのAndroidライブラリです。これを実現するために LifecycleOwner の拡張関数を公開しています。

ドキュメント

機能 説明
LifecycleOwner.every(time, unit, action) timeごとに unit 単位で action を実行します。例: time=2 unit=seconds は、2秒ごとに実行されることを意味します。
LifecycleOwner.everySecond(action) 1秒ごとにアクションを実行します。
LifecycleOwner.everyMinute(action) 1分ごとに action を実行する。
LifecycleOwner.after(time, unit, action) time の後、actionunit 単位で once 実行する。

インストール方法

  1. プロジェクトレベルの build.gradle で。

allprojects {
   repositories {
      ...
      maven { url 'https://jitpack.io' }
    }
}
    1. アプリレベルの build.gradle に。

dependencies {
     implementation 'com.github.sidhuparas:every-after:1.1'
}

Kotlinでの完全な例を示します。

MainActivity.kt.

package com.paras.everysample

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.paras.every.after.after
import com.paras.every.every
import com.paras.every.everyMinute
import com.paras.every.everySecond
import java.util.concurrent.TimeUnit

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val sec = everySecond { time ->
            log("1. $time")
        }

        everyMinute { time ->
            log("2. $time")
        }

        after(1, TimeUnit.MINUTES) {
            sec.cancel()
            log("3. Done")
        }

        every(1, TimeUnit.MINUTES) { time ->
            log("4. $time")
        }
    }

    private fun log(message: Any?) {
        Log.d("Every-After", message.toString())
    }
}

FAQ

  1. after 関数の機能を再現するために Handler を使うことができます。回答:ハンドラは不用意に使用するとメモリリークを起こすことがよく知られています。every-afterを使えば、アクティビティやフラグメントが破壊されたときにタスクをキャンセルする処理を行う必要がありません。自動的に処理されます。
  2. 自分でタスクをキャンセルすることはできますか 回答: はい、各関数は Cancellable インターフェースを実装したオブジェクトを返します。タスクをキャンセルするには、その上でcancel()関数を呼び出してください。
  3. 私はLifecycleOwnerオブジェクトにアクセスできません。自分でタスクをキャンセルすることができます。LifecycleOwnerなしで関数を使用することはできますか Ans: 現在はできません。近日公開予定です。

参考文献

完全なリファレンスはこちらをご覧ください。