传递回调对象的两种形式

作者: 安新小子 | 来源:发表于2017-04-11 18:14 被阅读93次

当我们设置监听的时候,方法中接收一个Listener对象,而对象的创建常常有两种方式,一种是直接new一个内部类;一种是创建一个new一个成员变量,然后将对象的引用传递到方法中。

以下代码只要关注带 ☆ 的一行即可,其他的没有和本文无关。
内部类形式:

mDialog.setListener(new RecognizerDialogListener() {
☆          String resultStr = "[";
            @Override
            public void onResult(RecognizerResult result, boolean isLast) {
                //isLast等于true时会话结束
                if(!isLast){
                    resultStr+= result.getResultString() +",";
                }else {
                    resultStr+= result.getResultString() +"]";
                    text = JsonParser.parse(resultStr);
                    mTextView.setText(text);
                }
            }
            @Override
            public void onError(SpeechError error) {
            }
        });

成员变量形式:

//如果使用这种方式创建监听对象,回调代码只会走onResult或者onError中,不会重新初始化resultString,所以要在最后在进行变量的初始化。
    private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
☆      String resultString = "[";
        @Override
        public void onResult(com.iflytek.cloud.RecognizerResult result, boolean b) {
            if(!b){
                resultString+= result.getResultString() +",";
            }else {
                resultString+= result.getResultString() +"]";
            }
            if(b){
                text = JsonParser.parse(resultString);
                mTextView.setText(text);
                resultString = "[";
            }
        }
        @Override
        public void onError(SpeechError error) {
        }
    };
   //将 new 出来的对象传递到方法中
   mDialog.setListener(mRecognizerDialogListener );

这两种方式有什么区别呢?
注意看两段代码带 ☆ 的位置,对于使用内部类的形式传递Listener对象每次执行setListener方法的时候,第三行代码都会运行,也就是说变量resultString 都会被重新初始化。但是使用成员变量的形式来传递Listener对象的时候,代码的逻辑直接进入回调方法,不会再走 ☆ 位置的代码,也就是说不会再初始化resultString 变量。

我们在实际使用中要注意,一般我们都是需要重新初始化变量的,如果使用成员变量的形式来传递Listener对象记得最后手动恢复默认值。

原因分析:因为第一种方式每次执行设置监听的方法都会 new 一个对象,所以就会重新创建一个变量;而第二种方式,只要第一次创建出来的对象没有销毁,这个对象就不会重新创建,所以对象中的变量也会一直存在。

欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。

张鹤的公众号

相关文章

  • 传递回调对象的两种形式

    当我们设置监听的时候,方法中接收一个Listener对象,而对象的创建常常有两种方式,一种是直接new一个内部类;...

  • jquery事件绑定

    事件绑定 1. jquery标准的绑定方式 jq对象.事件方法(回调函数); 注:如果调用事件方法,不传递回调函数...

  • react中ref的两种使用方法

    ref一共有两种使用方式 回调函数形式(官方推荐) string形式 第一种 回调函数形式 回调函数形式一共有三种...

  • JavaScript中的对象

    1.对象是JavaScript的基础,对象可以通过两种形式定义:声明(文字)形式和构造形式.对象的文字语法: 对象...

  • 对象

    对象 对象可以通过两种形式定义: 声明形式和构造形式 声明形式语法: var myObj = {key:value...

  • JavaScript 对象

    对象 语法 对象可以通过两种形式定义:声明(文字)形式和构造形式。 文字形式: 构造形式: 构造形式和文字形式生成...

  • 我不知道的Vue - watch

    前置知识 MDN|object.defineProperty() 两种对象属性描述 对象里的属性可以分为两种形式,...

  • JavaScript对象

    什么是对象 可以使用两种形式来创建对象: 声明形式和构建形式。 js 数据类型 string number boo...

  • Redux相关

    Redux actionsactions其实是描述操作的对象,我们调⽤dispatch时需要传⼊此对象 store...

  • 对象

    对象可以通过两种形式定义:声明(文字)形式和构造形式。 var myObj = { 文字形式。 key: valu...

网友评论

    本文标题:传递回调对象的两种形式

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