Android知识Android开发Android技术知识

传递回调对象的两种形式

2017-04-11  本文已影响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 一个对象,所以就会重新创建一个变量;而第二种方式,只要第一次创建出来的对象没有销毁,这个对象就不会重新创建,所以对象中的变量也会一直存在。

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

张鹤的公众号
上一篇下一篇

猜你喜欢

热点阅读