【问题标题】:Java refer static reference to non-static methodJava将静态引用引用到非静态方法
【发布时间】:2015-02-21 05:40:05
【问题描述】:

我在尝试将静态引用引用到 Android Java 中的非静态方法时遇到了一些问题。基本上从我的详细信息类中,当我的按钮 onClick 时,它将在另一个类中执行 logintoFacebook():

ivFacebookShare.setOnClickListener(new OnClickListener() {
    public void onClick(View v){
        AndroidFacebookConnectActivity.loginToFacebook();
    }
});

在我的 AndroidFacebookConnectActivity 类中:

public static void loginToFacebook() {

    mPrefs = getPreferences(MODE_PRIVATE);
    String access_token = mPrefs.getString("access_token", null);
    long expires = mPrefs.getLong("access_expires", 0);

    if (access_token != null) {
        facebook.setAccessToken(access_token);
    }
    if (expires != 0) {
        facebook.setAccessExpires(expires);
    }
    if (!facebook.isSessionValid()) {
        facebook.authorize(this, new String[] { "email", "publish_stream" }, new DialogListener() {

            public void onCancel() {
            }

            public void onComplete(Bundle values) {
                // Function to handle complete event
                // Edit Preferences and update facebook acess_token
                SharedPreferences.Editor editor = mPrefs.edit();
                editor.putString("access_token", facebook.getAccessToken());
                editor.putLong("access_expires", facebook.getAccessExpires());
                editor.commit();
            }

            public void onError(DialogError error) {
            }

            public void onFacebookError(FacebookError fberror) {
            }

        });
    }
}

但是,我在getPreferences 收到错误消息:无法从 Activity 类型对非静态方法 getPreferences(int) 进行静态引用

facebook.authorize(this,:不能在静态上下文中使用它

有什么想法吗?提前致谢。

【问题讨论】:

  • 将上下文传递给静态方法
  • 在将上下文传递给静态方法后,我会收到此错误消息:方法 getPreferences(int) 未为上下文类型定义

标签: java android static


【解决方案1】:

Context 对象传递给您的方法loginToFacebook() 并使用它来获取getPreferences() 的访问权限

喜欢

public static void loginToFacebook(Activity activityContext) {
    mPrefs = context.getPreferences(MODE_PRIVATE);
    // ....... add your code here..
}

你可以在哪里调用这个方法

AndroidFacebookConnectActivity.loginToFacebook(getActivity()); // If calling from fragment

如果从 Activity 调用

AndroidFacebookConnectActivity.loginToFacebook(ActivityName.this);

【讨论】:

  • 静态方法和类始终保留在内存中,但您仍在使用静态,奇怪。!这不会释放内存并可能导致性能下降。
  • 我收到此错误消息:方法 getPreferences(int) 未为 Context 类型定义
  • :) 如果您是 Android 开发人员,那么您试图强制使用非静态方法很奇怪。如果您可以将方法设为静态,Android 始终建议您不要创建类的对象。 :)
  • @PankajKumar 你能为你的句子提供一些developer.android 链接吗?
  • @SilentKiller :) 知识不能混为一谈。所以这并不意味着你的知识比我少。阅读developer.android.com/training/articles/…
【解决方案2】:

问题是您使用getPreferences() 这是一个非静态方法,而您在静态方法public static void loginToFacebook() 中使用该方法

不允许在静态方法中使用任何非静态方法。您需要从loginToFacebook() 方法中删除静态修饰符。

试试这样:

public void loginToFacebook() {
    mPrefs = getPreferences(MODE_PRIVATE);
    // Add your code here.
}

【讨论】:

  • 如果我去掉了静态,当另一个类的onclick监听器无法访问时
  • 您可以在设置了onClickListener() 的位置创建该类的实例,然后可以使用该方法。
  • 抱歉,您介意给我举个例子吗?
  • 首先连接方法是一种实用方法,您需要将它们添加到实用程序类而不是 Activity 类中。
  • 但是我从本教程中遵循了它:androidhive.info/2012/03/android-facebook-connect-tutorial
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 2013-06-30
  • 1970-01-01
  • 2018-11-25
  • 2014-11-19
  • 1970-01-01
相关资源
最近更新 更多