JSP_Blog

ジェイエスピー社員が綴る日替わりブログ

【Android】MediatorLiveData で他の LiveData を監視する

2022-05-17 09:52:24 | 日記
今回は、MediatorLiveData で他の LiveData を監視する方法を解説します。

なお、ここに掲載しているソースコードは以下の環境で動作確認しています。

- Android Studio Bumblebee | 2021.1.1 Patch 2
- JDK 11.0.11
- Android Gradle Plugin 7.1.2
- Kotlin 1.6.10
- Gradle 7.4.1
- androidx.lifecycle 2.4.1

MediatorLiveData とは?


MediatorLiveData は LiveData のサブクラスであり、他の LiveData の値を監視して自身の値を変更することができます。

以下が、監視対象を追加するメソッドです。


@MainThread
public <S> void addSource(@NonNull LiveData<S> source,
                          @NonNull Observer<? super S> onChanged)


引数 source に監視対象の LiveData を設定します。そして、引数 onChanged に引数 source が変更されたときに呼び出されるコールバックを設定します。

なお、1 つの MediatorLiveData で、2 つ以上の LiveData を監視することが可能です。


// OK
mediator.apply {
    addSource(source1) { mediator = it }
    addSource(source2) { mediator = it }
}


しかし、MediatorLiveData は 1 つの LiveData に対して 2 つ以上のコールバックを設定することができません。

以下のように、すでに監視を開始している LiveData に対して、異なるコールバックを設定した場合、MediatorLiveData#addSource は IllegalArgumentException を投げます。


// NG
mediator.apply {
    addSource(source1) { mediator = it }
    addSource(source1) { mediator = "source1: $it" }
}


監視を停止したい場合には、以下の MediatorLiveData#removeSource を使います。


@MainThread
public void <S> removeSource(@NonNull LiveData<S> toRemote)


MediatorLiveData を使う


実際に MediatorLiveData を試してみます。

今回は、Activity と ViewModel、そして、String 型の値を持つ LiveData を 2 つとそれらを結合する MediatorLiveData を 1 つ用意します。MediatorLiveData は、2 つの LiveData を監視し、それらが変更されるたびに 2 つの LiveData を結合して自身に格納します。

上記の 3 つの LiveData を ViewModel に保持し、Activity から結合元となる 2 つの LiveData の変更と MediatorLiveData の監視を行います。

ライブラリのインポート


MediatorLiveData を使えるようにするために、アプリの build.gradle ファイルに次の依存関係を追加します。


dependencies {
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1"
}


lifecycle-livedata-ktx をインポートすることにより、MediatorLiveData が使えるようになります。また、以降のサンプルでは LiveData を ViewModel に保持するため、lifecycle-viewmodel-ktx もインポートします。

ViewModel で値の保持と結合を行う


まず、ViewModel を以下のように実装します。


class MainViewModel : ViewModel() {

    // editText1 の文字列
    val str1 = MutableLiveData("")

    // editText2 の文字列
    val str2 = MutableLiveData("")

    // editText1 と editText2 の結合
    val linkedStr: MediatorLiveData<String> = MediatorLiveData()

    init {
        linkedStr.apply {
            // str1 の変更を監視する。
            addSource(str1) {
                linkedStr.value = "$it ${str2.value!!}"
            }
            // str2 の変更を監視する。
            addSource(str2) {
                linkedStr.value = "${str1.value!!} $it"
            }
        }
    }
}


監視の開始を init で行います。2 つの LiveData ごとに addSource を呼び出します。監視対象が変更されたら、もう一方の LiveData と結合して、自身に格納します。

Activity で LiveData の変更と MediatorLiveData の監視を行う


そして、Activity を以下のように実装します。


class MainActivity : AppCompatActivity(R.layout.main_activity) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val viewModel =
            ViewModelProvider(this)[MainViewModel::class.java]

        // editText1 の文字列変更を str1 に反映する。
        findViewById<EditText>(R.id.editText1)
            .doOnTextChanged { text, _, _, _ ->
                viewModel.str1.value = (text ?: "").toString()
            }

        // editText2 の文字列変更を str2 に反映する。
        findViewById<EditText>(R.id.editText2)
            .doOnTextChanged { text, _, _, _ ->
                viewModel.str2.value = (text ?: "").toString()
            }

        viewModel.linkedStr.observe(this) {
            findViewById<TextView>(R.id.text).text = it
        }
    }
}


Activity のレイアウトには、2 つの LiveData ごとに EditText を用意し、それらのテキストの変更を監視し、テキストを ViewModel の LiveData に格納します。

そして、2 つの LiveData を結合した `linkedStr` を監視し、その値を TextView に表示します。

こうすることにより、2 つの EditText に入力したテキストを結合したものが TextView に表示されるようになります。(さ)

シンプル入退室管理
  限りなくシンプルなタイムカードシステム

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

moni-stock
  一括スキャンで入出庫・棚卸作業にかかる時間を短縮
  お客様も現場も笑顔にする在庫管理システム

moni-meter
  脱・手書き!点検データをデジタル化して誤検針削減
  ローコストで導入しやすい設備点検支援システム

Smart mat
  重さセンサIoTで在庫管理に革新を。
  自動発注&メールアラートで欠品・発注ミスを防ぎます

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(moniシリーズ)、それに農業も手がけるIT企業
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ブログを書くのも大変だ

2022-05-16 09:00:00 | 日記
どうも、ブログネタに困っているTです。
ブログネタに困るといつも、大昔にやっていたSNSで「ネタが無いことをネタにすればいい!」と言われたことを思い出します。ということで、ネタが無いことをネタに何か書いてみようと思います。

会社のブログを書くというのは、意外と大変なことだなあと感じます。
あまりプライベートなことを書きすぎてもおかしな感じになりそうですし、かといって日々の業務について書こうとしても「大変~」とか「しんどい~」とかがまず最初に思いつくことなので、そんなに暗いことを書きたくない!
という感じで、「じゃあ何を書こうかな~」と頭を悩ませることが多いです。

私が入社する前から続くこのブログですが、思い返せば執筆の依頼の連絡には長らく「身の回りのちょっとした出来事や気づきを書いてください」なんて書いてありました。ユニークなブログが増えたのでそんな一文もいつからか無くなったのですが、改めて考えると「気軽に書いてね」というメッセージでもありつつ、それができるのは結構すごいことなのではないか?とも思います。

「情報社会」なんて言葉ができてから随分と年月が経ちましたが、現在は「ファスト映画」なる言葉が生まれるほど一つ一つの情報処理に時間をかけない文化が出来上がってきたように思います。そういう文化の中では、身の回りのことも適当に処理してしまって、あまり気付きがないのではないかな、と思います。
そうすると他のさまざまなことに影響しはじめ、段々と集中力や思慮深さを失ってしまうのかな、と。

まさにそうなっている私からすると、サッと思ったこと、気づいたことをブログにできる人は凄いな~と感じます。物事を考える上で大事なことがわかっているのだな、と、考える軸や芯ようなものを持っているのだな~と。
ただ一方で、いざブログを書き始めてみると、意外にもいろんな書きたかったことを思い出したり、思いついたりします。普段はなかなか思い出せないだけで、きっとほとんどの人が普遍的に持っている力なのでしょうね。
これは文章を書く以外も同じことだと思います。自信を無くしたり、考え方が後ろ向きになってしまったり、もしくは単に疲れていたりするとサッと実力を発揮できなくなってしまいますが、だからといって自分を卑下する必要はないんじゃないかな?と。「とりあえず」でやってみると、意外とだんだん乗り気になってくるものです。

何だか「ネタが無いこと」をネタにしようとしたら全然違う話になってしまいましたが、この辺で!

(毎月ブログをこなせて偉いT)

シンプル入退室管理
  限りなくシンプルなタイムカードシステム

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

moni-stock
  一括スキャンで入出庫・棚卸作業にかかる時間を短縮
  お客様も現場も笑顔にする在庫管理システム

moni-meter
  脱・手書き!点検データをデジタル化して誤検針削減
  ローコストで導入しやすい設備点検支援システム

Smart mat
  重さセンサIoTで在庫管理に革新を。
  自動発注&メールアラートで欠品・発注ミスを防ぎます

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(moniシリーズ)、それに農業も手がけるIT企業
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

目指すは清廉潔白

2022-05-13 09:00:00 | 日記
4月の最後の営業日に社員会主催で新人歓迎会が催されました。
(と真さんもお書きになっていましたが、、)
まだまだ全員で1箇所に集うということは難しいので、今年もオンラインイベントとしての開催です。

今年度入社の方を囲んだ楽しい会でしたよ。気分がとてもリフレッシュされました。
その時の会話で、後日になってふっと引っかかった言葉があり、GW中につらつらと思いを巡らしておりました。

「清廉潔白な社会人になりたい。」正確な表現は違っていたかと思いますが
(きっとちょっと違う。ごめんなさい。結構いい年齢なので記憶力が、、、)

清廉潔白をあらためて辞書をみてみると
「心が清くて私欲がなく、後ろ暗いところのないこと。」

若い方からこんなことを伺うと、なんだか清々しい気分になります。(ありがとうフフ)

振り返ってみればもうずいぶん長い間社会人として働いています。
先を見れば残された時間が少ないってぐらいですわ。ホホッ!

転職が4回、職種は5回チェンジ。
さて、私自身は今までビジネスパーソンとしてどういう人であったのでしょうかね。
う~んちょっと真面目に、私にとって心の拠り所になる理念はなんだろう?
そうだ「正直であること」

さあ、なぜそうなったかですね。
かつて勤めていた会社の大手取引先(いわゆる大企業です)が内部告発をきっかけに不正が露呈し、
あれよあれよという間に会社が解散となった事件がありましてね、
この事件の後、不正直な商売はどこかで破綻するなぁと強く思いました。
(まあそうならない場合もありますが。。。)
そんなことからですかね。まあウソついてもばれますからね。

ところで、その事件のその後を追ってみました。辛い事実が出てきました。
内部告発をした人のその後は波乱万丈、困難続きのビジネス。。。

考えてみれば、自分が正しいと思うことを選択することで周囲から反感を買ったり、
集団から追い出されたり、そんな事は日常でもよく起こりますね。

「正しい行い」は国や文化、人によっても異なっていて、人に強要する事は出来ないから
自分が信じるところの行いを、責任をもって自ら選択していかねば。

しかし、困ったことに自分が正しいと思うことを貫いたために周囲が傷ついてしまうこともありますね。。。

それでも生きていく事は選択の積み重ね。チャレンジし続けるしかないですね。
(このチャレンジって言葉大好きです。落ち込んでいる時でも勇気が出てくる。
しかし春はこれが魔法の言葉にならない時もあり。変化がありすぎ!この季節)

さて、清廉潔白な人物を表現するこんな素敵な表現もありました。
「水晶は、穢れとなる一点の塵も受け付けない」
新人の方々にはぜひそんな風に輝いてほしいですね。(の)

おまけ
新緑の中で赤い葉をつけるモミジ
下から見上げると光に透けて輝いていました。きれ〜^^


シンプル入退室管理
  限りなくシンプルなタイムカードシステム

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

moni-stock
  一括スキャンで入出庫・棚卸作業にかかる時間を短縮
  お客様も現場も笑顔にする在庫管理システム

moni-meter
  脱・手書き!点検データをデジタル化して誤検針削減
  ローコストで導入しやすい設備点検支援システム

Smart mat
  重さセンサIoTで在庫管理に革新を。
  自動発注&メールアラートで欠品・発注ミスを防ぎます

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(moniシリーズ)、それに農業も手がけるIT企業

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

コバエとの仁義なき戦い

2022-05-12 12:05:38 | 日記
先月までは心地よい涼しい日々が続いていましたが、突如として夏日が続くようになりました。
花粉から解放され、ようやく外に出れるようになったかと思えば、春を感じる間もなく「もうすぐ夏だぞ」と叩きつけられたような気分です。
今年は桜も見れなかったので花粉の思い出しかありません。

そんな夏日に誘われ人だけでなく虫達も活発になってきます。
登山をやっていると虫の問題からは避けられないですが、家に引きこもっているうちは彼らのことを忘れられます。
そんな安住の地である我が家で起きた出来事の話。

※今回虫話なので注意※

田舎育ちなもんで家の中に虫が出るのが当たり前の生活を送ってましたが、現在の居はありがたいことに虫がほとんど出ません。
ゴキは1匹も出ませんし、コバエや蚊も年に片手で数える程度。
そんなところが気に行ってたりしてたのですが、ある時急にコバエが発生するようになりました。
別に生ゴミ放置してたり窓開けっぱなしにしてたわけではないんですが、部屋の中に常に一匹いるような状態。
何匹か叩き潰せばすぐいなくなるだろうと思ってましたが、叩き潰してもすぐに新しいのが補充され、いつまで経ってもいなくなる気配がありません。
リモートワーク中にも画面の前飛ばれたりするので気が散って仕方ありません。
精神衛生上よろしくないのでいい加減対策することにしました。

対策1:コバエホイホイ
ゴキ相手であれば定番はゴキブリホイホイ。
ならばコバエもホイホイ。
というわけで買ってきましたコバエホイホイ。

容器内のゼリーでコバエを誘引し、ゼリーにもぐらせて退治するというものです。
能動的に退治はできませんが、放置していれば勝手に退治してくれるのは便利です。
これはそこそこ効果があり、多い時で1日1,2匹は捕まえてくれます。
ただし、全く捕れない日の割合の方が多く、コバエを殲滅するには至りませんでした。
また、捕まえられるコバエの種類にも制限があり、ショウジョウバエ類やノミバエ類以外には効果がありません。
事前にコバエの種類を把握しておく必要があるでしょう。
あと独特のにおいを放つため、長時間いるところに置いておくとにおいが気になります。
場合によっては開封から使用期限まで1匹も捕らえられないパターンもあったため次の対策を取ることに。

対策2:コバエスプレー
最近話題の部屋にワンプッシュしておくだけでコバエがいなくなるというスプレー。
かつては蚊取り線香やアースノーマットのように常に焚いておくものでしたが、ワンプッシュしておけば効果が1日持続するという優れモノ。

早速使ってみると…、コバエがいなくなっている気が!
まぁ、常に視界上にいるほど飛んでるわけでもないので目の前で落ちてくれるわけでもなく、効果のほどは実感しにくいです。
コバエホイホイは容器の中を見れば死んだコバエが増えているのでわかりやすいのですが。

とか思ってましたが、またすぐコバエが出てきました。
1日持ちません。
何回か使いましたが改善には至らず、劇薬を生活空間にスプレーし続けるのも衛生的に気になったので次の対策へ。

対策3:手で頑張る
やはり道具などには頼っていられない。
信じられるのは己の肉体のみ。
視界に入ったコバエを叩き潰します。
片手ではなくしっかり両手を使う方が取り逃しが少なくてよいです。
効果は己のスキル依存。
幼少より虫と戦ってきた自分ですが、撃墜率は2割弱程度。
それでも上の対策より効果的でした。
しかし、能動的に動く必要があるうえ、逃すとストレスがたまるので結局精神衛生上よろしくありません。
何匹倒してもいなくならない現状に疲れ果て次の対策を取ることに。

対策4:誘蛾灯
コンビニの外とかにあるあれ。
蛍光灯で虫を誘引し、蛍光灯周りの電気線で虫を感電死させます。
この便利な世の中なので小型な家庭用も売ってるだろうと探してみたところやっぱりありました。

これがすごい効果的。
割と結構殺してくれます。
コバエが感電死した際にバチッという音と共に焼けたようなにおいがするのですが、それでコバエを退治できたことがわかるので効果を実感できます。
欠点としてはまぶしいこと。
さらに部屋が暗い方が蛍光灯の明かりが際立って効果的なので、外出する時に使うといいでしょう。

そんなこんなしているうちにコバエも発生しなくなり、我が家に平穏が訪れました。
コバエ退治に疲れた方はぜひ誘蛾灯を試してみてください。(村)

シンプル入退室管理
  限りなくシンプルなタイムカードシステム

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

moni-stock
  一括スキャンで入出庫・棚卸作業にかかる時間を短縮
  お客様も現場も笑顔にする在庫管理システム

moni-meter
  脱・手書き!点検データをデジタル化して誤検針削減
  ローコストで導入しやすい設備点検支援システム

Smart mat
  重さセンサIoTで在庫管理に革新を。
  自動発注&メールアラートで欠品・発注ミスを防ぎます

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(moniシリーズ)、それに農業も手がけるIT企業
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

母の日のケーキ

2022-05-11 09:00:00 | 日記
あっという間にGWがおわってしまいました。
本当にあっという間でした……。
久しぶりの友達に会ったり、ひとりでカメラをもって近所の川辺を散歩したり、家で映画を見たり。
ひとりで過ごす時間も、誰かと過ごす時間も、猫とまったり過ごす時間も充分に満たされました。
もうすでに来年のGWが楽しみです。

連休の最終日が母の日だったので、少し都心に方に住む母の家におじゃましてきました。
向かう電車内も、乗り換えの駅も、母の日の広告で色鮮やかでした。
なにも準備せず向かってしまっていたので、途中で何か買っていくつもりでしたが、
「やっぱりお花がいいのかな。でも姉が花を送ったと言っていたから、それ以上いらないかな。いやでも花はたくさんあってもいいのかな…。」などと悩んでいるうちに、最寄り駅に到着してしまいました。
駅のお店もいくつか覗き、化粧品や雑貨用品などを見てみましたが、結局決められず。
よく考えれば誰かへのプレゼントに最低でも1週間悩む自分にとって、そんな短時間でモノを選ぶのはなかなか難題でした。

結局家までの道のスタバで、ケーキとラテを買っていきました。
1件目は悩みながらもスルーしてしまいましたが、2件目を通り過ぎる前にぎりぎりで決心できました。

さんざん悩んで、買ってからも「結局食べ物でよかったかな。」なんて思っていましたが、
母にケーキが入った紙袋を渡したら「母の日最高~!!」と喜んでくれました。(笑)
スタバが1件しかなければなにも買えていなかったので、世の中にスタバがたくさんあって本当によかったです。

プレゼントはもらうのも、贈るのも嬉しいし楽しい。
なにを贈るか悩む時間も好きだけれど、今後はタイムアタック要素はなるべく排除しなくては。
来月の父の日に向けて、今からプレゼントを考えておこうと思います。
去年は防災バッグをあげたような…。今年はもう少しわくわくするようなものをあげたいな。
あと1か月ちょっと、たっぷり悩みそうです。
(あ)

シンプル入退室管理
  限りなくシンプルなタイムカードシステム

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

moni-stock
  一括スキャンで入出庫・棚卸作業にかかる時間を短縮
  お客様も現場も笑顔にする在庫管理システム

moni-meter
  脱・手書き!点検データをデジタル化して誤検針削減
  ローコストで導入しやすい設備点検支援システム

Smart mat
  重さセンサIoTで在庫管理に革新を。
  自動発注&メールアラートで欠品・発注ミスを防ぎます

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(moniシリーズ)、それに農業も手がけるIT企業
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする