传递回调对象的两种形式
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 一个对象,所以就会重新创建一个变量;而第二种方式,只要第一次创建出来的对象没有销毁,这个对象就不会重新创建,所以对象中的变量也会一直存在。
欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。
张鹤的公众号