MVVM / ViewModels で Android Network Service Discovery (NSD) を使用する方法に関するアドバイスを探しています。
基本的に、公式の Android ページからMainActivity にサンプル コードをカット アンド ペーストすることで、基本的な NsdManager アプリを正常に構築しました。
// Instantiate a new DiscoveryListener
private val discoveryListener = object : NsdManager.DiscoveryListener {
// Called as soon as service discovery begins.
override fun onDiscoveryStarted(regType: String) { // ...etc...
override fun onStartDiscoveryFailed(serviceType: String, errorCode: Int) {
Log.e(TAG, "Discovery failed: Error code:$errorCode")
nsdManager.stopServiceDiscovery(this) // ...etc....
私の基本的なアプリは動作しますが、大量のコードを MainActivity にダンプするのではなく、「ベスト プラクティス」を採用して MVVM を適用しようとしています。
私が理解している場合、これは ViewModel が nsdManager にサービスの検出を開始するように指示することを意味します。つまり、ViewModel内にこのようなコードを持っています
nsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, discoveryListener)
その後、MainActivity ビューは ViewModel とやり取りして (おそらく LiveData を介して?)、発見されたサービスのリストを表示できます。
ただし、ViewModel からアクセスできる nsdManager を作成する方法にすぐに行き詰まります。
MainActivity では、このような nsdManager をインスタンス化できます。
val nsdManager: NsdManager? = context.getSystemService(Context.NSD_SERVICE) as NsdManager?
しかし、私が理解している場合(?)、ViewModel内にこのようなコードを含めると、アクティビティの「コンテキスト」依存関係が導入されます-避けるべきもの。
私は Android の初心者であり、ViewModel などがどのように機能するかについて完全に間違った考えを持っている可能性が十分にあります。
Android NSDManager を ViewModel と組み合わせる方法についてのアドバイス (またはさらに良い例) をいただければ幸いです。