将函数参数传递给Java中的回调函数

时间:2014-10-15 14:07:22

标签: java

我有这段代码:

public void FbShare(JSONObject parameters) {

    if (Session.getActiveSession() == null || !Session.getActiveSession().isOpened()) {

        Session.StatusCallback callback = new Session.StatusCallback() {

            @Override
            public void call(Session session, SessionState state, Exception exception) {

                if (state.isOpened()) {
                    publishFeedDialog(parameters);  // <--- HERE
                }
            }
        };

        Session.openActiveSession(this, true, callback);
    } else {
        publishFeedDialog(parameters);
    }
}

为什么parameters来电无法访问publishFeedDialog(parameters)

5 个答案:

答案 0 :(得分:4)

尝试让这个论点最终:

public void FbShare(final JSONObject parameters) {

答案 1 :(得分:4)

parameters参数设置为final

public void FbShare(final JSONObject parameters) {
 //...    
}

有关正在发生的事情的概述,请参阅:

答案 2 :(得分:2)

将第一行更改为

public void FbShare(final JSONObject parameters) {

答案 3 :(得分:1)

编译器错误消息告诉您需要知道的一切,如果您可以解密它:

 Cannot refer to the non-final local variable parameters in an enclosing scope

也就是说,封闭范围中的变量parameters不是final,因此无法引用它。

要解决此问题,请将其设为final

 public void FbShare(final JSONObject parameters) {

Java不够聪明,无法跟踪parameters引用的内容,除非您使用final来保证它始终指向同一个对象。

如果你指的是一个不是方法参数的局部变量,这同样适用:

 public void foo() {
      final String bar = ...;
      Callback callback = new Callback() {
           void invoke() { 
               something(bar); 
           }
      };

答案 4 :(得分:0)

使您的参数成为最终参数,以便可以在您的匿名类中使用。