java - Android Studio 中的方法引用

标签 java android android-studio java-8 method-reference

我正在尝试在 Android Studio 中使用 Java 8 功能。具体方法引用。更具体地说,是对特定对象的实例方法的引用。使用措辞Oracle docs page .

我的违规代码是这样的。相关方法是 initTablet 和 doStuff,这是我用来解决这个问题的虚拟方法。

public class SettingsPresenter {

    SettingsFragment fragment;
    DeviceModel deviceModel;

    public SettingsPresenter(SettingsFragment fragment) {
        this.fragment = fragment;
        Context appContext = fragment.getActivity().getApplicationContext();
        deviceModel = new DeviceModel(appContext);
    }

    public boolean showTabletInit() {
        Map<String, String> creds = deviceModel.getServerCredentials();
        if (creds.get("pname").isEmpty() || creds.get("pvalue").isEmpty()) {
            return true;
        }
        return false;
    }

    public int doStuff() {
        return 1;
    }

    public void initTablet(String tokenId) {
        Log.d("debug", tokenId);
        deviceModel.initServerCredentials(tokenId, this::doStuff);
    }
}

错误在

处突出显示
deviceModel.initServerCredentials(tokenId, this::doStuff);

“this::doStuff”显示无法解析方法错误。

我按照步骤Android Java 8 support page进行操作。因此,我的项目结构中有以下值:

  • 编译 SDK 版本:API 25:Android 7.1.1 (Nougat)
  • 构建工具版本 26.0.2
  • 源兼容性 1.8
  • 目标兼容性 1.8

我的 build.grandle 看起来像这样

应用插件:'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "com.hoistiq.machinelog"
        minSdkVersion 25
        targetSdkVersion 25
        versionCode 2
        versionName "0.1.1"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation 'com.android.support:recyclerview-v7:25.1.0'
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support:support-v4:25.1.0'
    compile 'com.android.support:design:25.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha9'
    compile 'com.google.code.gson:gson:2.4'
    compile 'com.android.volley:volley:1.0.0'
    compile 'com.google.android:flexbox:0.2.5'
    testCompile 'junit:junit:4.12'
}

这一切都在 Android Studio 3.0 上进行。 谢谢。

最佳答案

使用/尝试该功能的情况并非如此。简而言之,当你离开类(而不是类内)时,你想引用一些东西。如果您想引用类内部的某个方法,只需像 dostuffthis.dostuff 一样调用它即可。如果您想练习这一点,您可以执行以下操作:

SettingsPresenter MyPresenter = new SettingsPresenter(A_Fragment);
deviceModel.initServerCredentials(tokenId, MyPresenter.doStuff);

方法dostuff不是静态的,所以我定义了一个对象。您可以使用静态方法和类名来完成此操作。

关于java - Android Studio 中的方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47118387/

相关文章:

java - 显示对话框的软键盘

android - 在 Android 上创建服务有多昂贵?

Java CEF - 是否可以访问 DOM 文档和加载页面的元素?

java - 当 Android 应用程序没有焦点时,如何保持其运行?

java - 多个线程执行相同的方法(非同步)行为

java.lang.IllegalArgumentException : Object would be serialized to `null` : Android 异常

android - 使用 Volley 进行异步发布时抛出 OutOfMemoryError "pthread_create (1040KB stack) failed: Try again"

android-studio - 如何使用 Android Studio 调试器后退一行代码

android-studio - 将方法参数分配给 Android Studio 中的字段的快捷方式

Android RecyclerView StaggeredGrid 项目在滚动时改变位置