rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

android開発 ViewModelScopeコルーチンの利用

2021 Aug. 28.

build.gradle(module:app)への設定

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0-alpha03"
}


viewModelScope のデフォルトCoroutineDispatcherはDispatchers.Main

viewModelScope のデフォルトの CoroutineDispatcher には、Dispatchers.Main が設定されている。
出典 Google Developers Japan: Android で簡単コルーチン: viewModelScope

android開発 ViewModelを引数付きで生成・初期化する

2021 Aug. 29.
2021 Aug. 28.

概要

  1. ViewModelを継承した引数付きクラスを定義する

  2. ViewModelProvider.Factoryを継承した、ViewModelの引数付きインスタンスを生成するためのクラスを定義する

  3. MainActivity内でViewModelProvider.Factoryの前記サブクラスのインスタンスを生成する


サンプル

SampleViewModel.kt
import androidx.lifecycle.ViewModel

class SampleViewModel(val user: String, val password: String): ViewModel() {
    // 以下にViewModel内の動作コードを記述する

}


SampleViewModelFactory.kt
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider

class SmbViewModelFactory(val user: String, val password: String): ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return SmbViewModel(user, password) as T
    }
}


MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {
    val user: String = "foo"
    val password: String = "pass"

    lateinit var sampleViewModel: SampleViewModel

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

        // get ViewModel
        val sampleViewModelFactory = SampleViewModelFactory(user, password)
        sampleViewModel = ViewModelProvider(this, sampleViewModelFactory).get(SampleViewModel::class.java)
    }
}

apply plugin: 'kotlin-kapt' build.gradle(module:app)内の記述場所

2021 Aug. 23.

次の記述で動いた

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

apply plugin: 'kotlin-kapt'


次の記述ではFailedとなった

apply plugin: 'kotlin-kapt'
plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

LinuxやWindowsのブラウザでのページURLのメール送信・共有

2021 Aug. 21.

スマホでは、共有機能で、ブラウザで開いているページをメールアプリに簡単に送ることができる。
LinuxWindowsには共有機能がない。
Firefoxなら、「メニュー-> IDメールアドレス -> 1個のタブを端末に送信」でまずスマホに送り、スマホFirefoxの「メニュー -> IDメールアドレス -> 今すぐ同期」でメールアプリと共有することができる。

Markdown書法での不等号の表現

2021 Aug. 19.

「"4"と"空白文字"と"アンド記号"と"L"と"T"と"セミコロン"と"空白文字"と"5"」で
4 < 5

アルファベットは大文字でも小文字でもよい。
アンド記号(アンパサンド)とセミコロンにはさまれたアルファベットで各種特殊文字を表す。

kotlin Resultクラスによる例外処理

2021 Aug. 19.

例外を補足するrunCatching { }の結果はResult<T>オブジェクトに格納される。
Resultのメソッドで例外発生有無を判定したり、処理の返り値としてResult<T>に格納されたTクラスのインスタンスを取得したりできる。

参考ページ
【Kotlin】try-catch がやりにくければ runCatching を使ってみよう! - Qiita


get系関数はいずれもブロックの実行に成功したときにはその結果の返値(Result<T>のTのインスタンス)を返す。
それぞれのget系関数で失敗したときの動作が異なる。
getOrNull( )

ブロック内で例外がスローされた場合は null が返る

getOrThrow( )

ブロック内でスローされた例外をそのままスローする

getOrDefault( )

指定されたデフォルト値を返す

getOrElse( )

指定された処理を実行する


isFailure

例外が発生していたらTRUEを返す

SMBサーバーへの接続での利用例

例1
(やっていること)
コルーチンブロック内のrunCatching { }内でSMBサーバーに接続する。
runCatching { }の結果を変数smbConnectionに入れる。
smbConnectionにはResult<T>型が入る。この例の場合は、Result<SmbFile>型。
smbConnection.getOrElse()で、例外が発生していなければResult<SmbFile>に入っているSmbFile型のインスタンスを取得でき、例外が発生していればthrow Exception("connectSmb failed.")が実行される。

    private suspend fun connectSmb(user: String, password: String, domain: String, smbroot: String): SmbFile {
        return withContext(Dispatchers.IO) {
            val prop = Properties()
            prop.setProperty("jcifs.smb.client.minVersion", "SMB202")
            prop.setProperty("jcifs.smb.client.maxVersion", "SMB300")

            val smbConnection = runCatching {
                val bc = BaseContext(PropertyConfiguration(prop))
                val creds = NtlmPasswordAuthentication(bc, domain, user, password)
                val auth: CIFSContext = bc.withCredentials(creds)
                SmbFile(smbroot, auth)
            }
            smbConnection.getOrElse {
                throw Exception("connectSmb failed.")
            }
        }
    }


例2
return@withContext runCatching { } .getOrElse { }で結果を返す

    private suspend fun connectSmb(user: String, password: String, domain: String, smbroot: String): SmbFile {
        return withContext(Dispatchers.IO) {
            val prop = Properties()
            prop.setProperty("jcifs.smb.client.minVersion", "SMB202")
            prop.setProperty("jcifs.smb.client.maxVersion", "SMB300")

            return@withContext runCatching {
                val bc = BaseContext(PropertyConfiguration(prop))
                val creds = NtlmPasswordAuthentication(bc, domain, user, password)
                val auth: CIFSContext = bc.withCredentials(creds)
                SmbFile(smbroot, auth)
            }
            .getOrElse {
                throw Exception("connectSmb failed.")
            }

        }
    }

firefoxでのマウスのスクロール量を変更する

2021 Aug. 15.

出典 「imwheel」でマウスホイールのスクロール移動量(スピード)を大きく | Pagent

about:configでmousewheel.default.delta_multiplier_yの値を変更する