Ссылки на метод в Android Studio

Я пытаюсь использовать функцию Java 8 в Android Studio. Конкретно ссылки на метод. Чтобы быть еще более конкретным, ссылка на метод экземпляра конкретного объекта. Использовать формулировку страницы документации Oracle.

Мой код обидеть это. Соответствующие методы - 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. И так же имеют следующие значения в моей структуре проекта:

  • Версия 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. Спасибо.

1 ответ

Это не тот случай, когда вы используете / пробуете эту функцию. Проще говоря, вы хотите сослаться на что-то, когда вы находитесь вне класса (не внутри). Если вы хотите сослаться на некоторый метод внутри класса, просто вызовите его просто как dostuff или же this.dostuff, Если вы хотите попрактиковаться в этом, вы можете сделать что-то вроде следующего:

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

Метод dostuff не является статичным, поэтому я определяю объект. Вы можете сделать это статическим методом и просто именем класса.

Другие вопросы по тегам