AndroidはKotlinプロパティを使用してエンティティクラスの別の書き方を傍受し、値の変更を適用し、UIのリフレッシュ、メッセージングを行う.

3262 ワード

常にステータスのリフレッシュをしている同僚は、最もよくEventBusやRxAndroidを使ってページをリフレッシュします.ページをリフレッシュするとき、少し煩わしいことがあります.私がやっているのは、新しい発見で、属性でページの状態を変えて、少しReat-Nativeしたいと思っています.propの言うステータスマシンは少し似ています.
実験操作は以下の通りである.
1.エンティティクラスを作成し、activityを作成します.1つのインタフェース
1)コネクタ
EntityListener.kt
interface EntityListener {
    fun afterChange(oldValue: Any, newValue: Any)
}

 
2)
BaseEntity.kt
package com.example.chenkui.myapplication.entity

import com.example.chenkui.myapplication.lister.EntityListener
open class BaseEntity {
    var entityListener: EntityListener? = null
    /**
     *                ,
     *            
     */
    inline fun onChange(crossinline onChange: (oldValue: Any, newValue: Any) -> Unit) {
        this.entityListener = object : EntityListener {
            override fun afterChange(oldValue: Any, newValue: Any) = onChange(oldValue, newValue)

        }

    }

    /**
     *                ,
     *          
     */
    internal fun onChangeCall(onChange: () -> Unit) {
        this.entityListener = object : EntityListener {
            override fun afterChange(oldValue: Any, newValue: Any) = onChange()
        }

    }

    /**
     *                
     *   var obserableProp: String by Delegates.observable("   ") { prop, old, new ->
     *    call(old, new)
     *    }
     *
     */
    internal fun call(oldValue: Any, newValue: Any) {
        if (entityListener != null) {
            entityListener!!.afterChange(oldValue, newValue)

        }
    }
}

3)
TestEntity.kt
package com.example.chenkui.myapplication.entity;

import kotlin.properties.Delegates

class TestEntity : BaseEntity() {
    companion object {
        var testEntity = TestEntity()
    }

    /**
     *     
     * //prop lambda                 
     * //old              
     * //new              
     */
    var obserableProp: String by Delegates.observable("   ") { prop, old, new ->
        call(old, new)
        println("===$prop== ====$old==   ==$new==")
    }
    var vetoableProp: Int by Delegates.vetoable(20) {
        prop, old, new ->
        call(old, new)
        println("===$prop== ====$old==   ==$new==")
        new > old
    }
}

4) MainActivity.kt
 var testEntity = TestEntity.testEntity
    public fun observable(v: View) {
        testEntity.onChangeCall {
            (v as TextView).text = testEntity.obserableProp
        }

        testEntity.obserableProp = "hello"
    }

    public fun observable1(v: View) {
        Toast.makeText(this, "test", Toast.LENGTH_LONG).show()
        testEntity.obserableProp = "    "
    }

 
 
observableの実行(v:View)
observable 1の実行(v:View)
初期値表示
"   "   "hello"
初期値「hello」を「1回変更」に変更
 
 
 
テストの結果、送信は1つのactivityで、別のactivityをリフレッシュすることができます.
たとえば、新しいactivityを作成し、次のコードを実行すると、前のページのTextViewをリフレッシュできます.
TestEntity.testEntity.obserableProp = "Main2Activity"

プロセスをまたぐ髪面についてはまだ試したことがあり、探究しなければならない.