Android 处理程序 java 到 kotlin

Android handler java to kotlin

我正在尝试在libgdx中控制admob。我找到了一些 java 代码,但无法将 java 翻译成 kotlin。你能帮助我吗。谢谢

private final int SHOW_ADS = 1;
    private final int HIDE_ADS = 0;
    protected AdView adView;


    Handler handler = new Handler(){


        @Override
        public void handleMessage(Message msg) {
            switch(msg.what){
                case SHOW_ADS:
                    adView.setVisibility(View.VISIBLE);
                    break;
                case HIDE_ADS:
                    adView.setVisibility(View.GONE);
                    break;
            }
        }
    };

Android工作室这样转换

 var handler: Handler = object : Handler() {
        override fun handleMessage(msg: Message) {
            when (msg.what) {
                SHOW_ADS -> adView.setVisibility(View.VISIBLE)
                HIDE_ADS -> adView.setVisibility(View.GONE)
            }
        }
    }

error:This 处理程序 class 应该是静态的,否则可能会发生泄漏(匿名 android.os.Handler)

通过覆盖 Handlerpublic void handleMessage(Message msg),您创建了一个 anonymous class。简而言之,处理程序存在的时间很可能比封闭的 class 长。这是不行的,因为内部 class 被外部 class 引用。最简单的解决方法是在 extends Handleroverride handleMessage(Message msg) 中创建一个单独的 class,而不是在另一个 class.

的内部

EDIT 涉及任何 Android OS 特定的 classes Fragments/Activities... anonymous classes 不起作用,因为您不将 args 传递给 fragments.

的构造函数的原因相同

我找到了一个很好的解决方案。

private val handler = object : Handler(Looper.getMainLooper()) {

        override fun handleMessage(msg: Message) {
            when(msg.what){
               SHOW_ADS->{adView.setVisibility(View.VISIBLE)} 
                HIDE_ADS->{adView.setVisibility(View.GONE)}


        }

首先,这个实现过于复杂。只需使用一个标准的处理程序,而不对其进行子类化和修改它处理消息的方式。您可以 post 一个 Runnable 来代替它。那么您也不必担心消息代码。

private val handler = Handler(Looper.getMainLooper())

override fun showAds(show: Boolean) = handler.post { 
    adView.visibility = if (show) View.VISIBLE else View.GONE
}