美文网首页
MessageQueue方法:postSyncBarrier、r

MessageQueue方法:postSyncBarrier、r

作者: 緦菍亭芷 | 来源:发表于2022-02-22 18:22 被阅读0次

    测试同步屏障

    1、ThreadHandler.kt

    package com.maotai.testapplication
    
    import android.os.*
    import com.yh.base.lib.log.LogUtils
    
    /**
     *  $
     * @date: 2022/2/22 5:13 下午
     * @author: zengbobo
     */
    object ThreadHandler {
        private var mHandler: Handler? = null
        fun main() {
            Thread {
                Looper.prepare()
                mHandler = MyHandler(Looper.myLooper()!!)
                Looper.loop()
            }.start()
        }
    
        class MyHandler(looper: Looper) : Handler(looper) {
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                LogUtils.i("ThreadHandler handleMessage $msg")
            }
        }
    
        fun sendEmptyMessage() {
            mHandler?.sendEmptyMessage(1)
        }
    
        fun sendAsyncMessage() {
            mHandler?.obtainMessage(2)?.apply {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
                    isAsynchronous = true
                }
                mHandler?.sendMessage(this)
            }
        }
    
        private var mTraversalBarrier:Int = 0
        fun postSyncBarrier() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val queue = mHandler?.looper?.queue
                var postSyncBarrier =
                    queue?.javaClass?.getDeclaredMethod("postSyncBarrier", Long::class.java)//
                postSyncBarrier?.isAccessible = true
                mTraversalBarrier =
                    (postSyncBarrier?.invoke(queue, SystemClock.uptimeMillis()+10000) as? Int)?:0//
            }
        }
    
        //removeSyncBarrier方法参数需要使用postSyncBarrier方法的返回值(mTraversalBarrier)
        fun removeSyncBarrier() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val queue = mHandler?.looper?.queue
                var removeSyncBarrier =
                    queue?.javaClass?.getDeclaredMethod("removeSyncBarrier", Int::class.java)
                removeSyncBarrier?.isAccessible = true
                removeSyncBarrier?.invoke(queue,mTraversalBarrier)
            }
        }
    }
    

    2、LooperActivity.kt

    package com.maotai.testapplication
    
    import android.os.Bundle
    import android.widget.TextView
    import androidx.appcompat.app.AppCompatActivity
    
    class LooperActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            ThreadHandler.main()
            findViewById<TextView>(R.id.tv1)?.apply {
                text ="sendMessage"
                setOnClickListener {
                    ThreadHandler.sendEmptyMessage()
                }
            }
            findViewById<TextView>(R.id.tv2)?.apply {
                text ="sendAsyncMessage"
                setOnClickListener {
                    ThreadHandler.sendAsyncMessage()
                }
            }
            findViewById<TextView>(R.id.tv3)?.apply {
                text ="postSyncBarrier"
                setOnClickListener {
                    ThreadHandler.postSyncBarrier()
                }
            }
    
            findViewById<TextView>(R.id.tv4)?.apply {
                text ="removeSyncBarrier"
                setOnClickListener {
                    ThreadHandler.removeSyncBarrier()
                }
            }
        }
    }
    
    

    3、activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="20dp"
            android:text=" FirstActivity"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <TextView
            android:id="@+id/tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="20dp"
            android:text=" LayoutActivity"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <TextView
            android:id="@+id/tv3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="20dp"
            android:text=" NormalActivity"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <TextView
            android:id="@+id/tv4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="20dp"
            android:text=" LooperActivity"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </LinearLayout>
    

    相关文章

      网友评论

          本文标题:MessageQueue方法:postSyncBarrier、r

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