传递回调对象的两种形式

作者: 安新小子 | 来源:发表于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 一个对象,所以就会重新创建一个变量;而第二种方式,只要第一次创建出来的对象没有销毁,这个对象就不会重新创建,所以对象中的变量也会一直存在。

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

    张鹤的公众号

    相关文章

      网友评论

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

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