美文网首页
Kotlin项目中常见用法

Kotlin项目中常见用法

作者: niudeyang | 来源:发表于2019-10-30 22:24 被阅读0次

    关于单例模式的使用,通过object声明的对象实际为单例模式对象

    1不带参数单例

    class MyClass private constructor(){

    private object Single{ val instance=MyClass()}

    companion object{

    fun create(){ return Single.instance}

    }

    }

    调用方式:MyClass.create()

    带参数单例

    class Singletonprivateconstructor(str: String){varstring: String = str;

    init {

    println("str is $str")

    println("string is $string")

    }

    companionobject{@Volatilevarinstance: Singleton? =nullfun getInstance(c: String): Singleton {if(instance ==null) {

    synchronized(Singleton::class) {if(instance ==null) {

    instance = Singleton(c)

    }

    }

    }returninstance!!

    }

    }

    }

    静态类 companion object{ 只有静态方法和静态变量}

    常见的setListener方式

    setOnClickListener{toast("随意")}或者setOnClickListener(object:View.OnClickListener{

    override funonClick(p0: View?) {}

    })

    setOnCheckedChangeListener{ compoundButton, b ->

    }或者通上

    addOnScrollListenner(object:RecycleView.OnScrollListenner(){

    orrivite fun onScroll(a,b,c,d){

    }})

    附注:在TWOBBBLE中ItemShotAdapter中处理了下拉加载更多 的布局,经过我的处理可以在生产中使用

    接口回调的一种实现方式通过构造函数

    class ItemShotAdapter(varmShots: MutableList, valitemClick: (Int) -> Unit, valuserClick: (Int) -> Unit) : RecyclerView.Adapter() {

    override funonBindViewHolder(holder: ViewHolder,position: Int) {

    holder.itemView.mItemCard.setOnClickListener{

    itemClick.invoke(position)//调用

    holder.itemView.mHeadLayout.setOnClickListener{

    userClick.invoke(position)//调用

    }}

    }

    2.外部实现

    mListAdapter= ItemShotAdapter(mShots,{

    EventBus.getDefault().postSticky(mShots[it])

    startDetailsActivity()

    },{

    EventBus.getDefault().postSticky(shots[it].user)

    startActivity(Intent(activity,UserActivity::class.java))

    })

    关于inline函数的调用情景1

    当参数类型是v: (Int) -> Unit是可以直接写在{}中

    /**

    * 当前网络是否可用

    */

    inline funAny.netAvailable(block: (a: Boolean) -> Unit) {

    if(Utils.isNetworkAvailable(App.instance)) block(true)elseblock(false)

    }

    调用

    override fun onSubscribe(d: Disposable) {

    //如果网络不可用取消链接

    netAvailable{

    if(!it) {

    onFailure(App.instance.resources.getString(R.string.net_disable))

    baseView?.hideProgress()

    d.dispose()

    }else{

    baseView?.showProgress()

    }

    }

    onStart(d)

    }

    编译之后实际的代码是

    if(Utils.isNetworkAvailable(App.instance)) {

    onFailure(App.instance.resources.getString(R.string.net_disable))

    baseView?.hideProgress()

    d.dispose()

    }

    else{

    baseView?.showProgress()

    }

    }

    onStart(d)

    }

    /**场景2

    * dp2px

    */

    inline funInt.dp2px(): Float = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(),App.instance.displayMetrics)

    /**场景三

    * 获取字符串

    */

    inline fun Context.obtainString(resId: Int): String =this.resources.getString(resId)

    dp2px和obtainString中this作为调用函数的对象呗函数本身使用

    关于匿名内部类生成

    1 Runnable delayRun=new Runnable() {

    @Override

    public voidrun() {

    //TODO

    };}

    valr:Runnable=Runnable{"ddddd"}

    2 mSortListSpinner.onItemSelectedListener=object: AdapterView.OnItemSelectedListener {

    override funonNothingSelected(p0: AdapterView<*>?) {}

    override funonItemSelected(p0: AdapterView<*>?,view: View?,position: Int,p3: Long) {

    mListAdapter=null

    mSortList=mList[position]

    getShots(false)

    }

    }

    kotlin网络请求订阅

    1,采用subscrible(onnext,oneeror,oncomplete)

    private val mCompositeDisposable= CompositeDisposable()

    val disposable =mMoviesRepository

    .getMovies()

    .observeOn(AndroidSchedulers.mainThread())

    .subscribe({it->  Logger.v("loadInTheatersMovies-size:${it.size}")

    view.showMovies(it)}

    ,{error->view.showError(error.toString())}

    ,{view.hideProgressDialog()})

    mCompositeDisposable.add(disposable)

    2.采用subscrible(obeserver)

    mDetailsBiz.unlikeShot(id,token,NetObserver({

    mDisposables.add(it)

    },{

    mDetailsView.unLikeShotSuccess()

    },{

    mDetailsView.unLikeShotFailed("${App.instance.obtainString(R.string.unlike_failed)}:$it")

    }))

    封装NetObserver:Observer

    class NetObserver<T>(valonStart: (Disposable) -> Unit,

    private valonResult: (T) -> Unit,

    private valonFailure: (String) -> Unit,

    private valbaseView: IBaseView? =null) : Observer<T> {

    override fun onError(e: Throwable) {

    e.printStackTrace()

    baseView?.hideProgress()

    if(eisNetExceptionHandler.ResponseException) {

    onFailure(e.message.toString())

    }else{

    onFailure("可能遇到了未知的错误,请重试")

    }

    }

    override fun onComplete() {

    baseView?.hideProgress()

    }

    override funonNext(t:T) {

    onResult(t)

    }

    override funonSubscribe(d: Disposable) {

    //如果网络不可用取消链接

    netAvailable{

    if(!it) {

    onFailure(App.instance.resources.getString(R.string.net_disable))

    baseView?.hideProgress()

    d.dispose()

    }else{

    baseView?.showProgress()

    }

    }

    onStart(d)

    }

    }

    关于继承类的open注解与Java的final意义相反:允许其他类继承本类。kotlin默认的所有类都是final类型,父类中采用open注解的成员

    才可以被复写

    open class Base{open fun v(){}fun nv(){}}

    class Derived():Base(){override funv(){} }

    可以使用var属性来复写val属性,反过来不可。因为val属性本质上声明了getter方法,复写为var属性在派生类中声明了setter方法

    interface Foo{val count:Int} class Bar1(override val count:Int):Foo classBar2:Foo{override var count:Int=0}

    不言而喻,抽象类或抽象函数无须使用open注解可以使用抽象来复写非抽象的open函数

    open class Base{open funf(){}}

    abstract class Derived:Base(){override abstract funf()}

    关于lateinit和lazy

    *lateinit 只用于 var,而 lazy 只用于 val

    *lazy 应用于单例模式(if-null-then-init-else-return),而且当且仅当变量被第一次调用的时候,委托方法才会执行。

    *lateinit 则用于只能生命周期流程中进行获取或者初始化的变量,比如 Android 的 onCreate()

    lateinit不能用在可空的属性上和java的基本类型上 如:lateinit var age: Int//会报错.

    f

    相关文章

      网友评论

          本文标题:Kotlin项目中常见用法

          本文链接:https://www.haomeiwen.com/subject/dvlybxtx.html