Ich versuche, eine Java 8-Funktion in Android Studio zu verwenden. Spezifische Methodenreferenzen Um noch spezifischer zu sein, ein Verweis auf eine Instanzmethode eines bestimmten Objekts. Um den Wortlaut der Oracle docs page zu verwenden.Methodenreferenzen in Android Studio
Mein fehlerhafter Code ist dies. Die relevanten Methoden sind initTablet und doStuff, was eine Dummy-Methode ist, mit der ich das herausfinden kann.
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);
}
}
Der Fehler wird bei
deviceModel.initServerCredentials(tokenId, this::doStuff);
mit "diesem :: doStuff" markiert das zeigt nicht Methode Fehler beheben können.
Ich folgte den Schritten Android Java 8 support page. Und so hat die folgenden Werte in meiner Projektstruktur:
- Compile Sdk Version: API 25: Android 7.1.1 (Nougat)
- Build-Tools Version 26.0.2
- Quelle Kompatibilität 1.8
- Ziel Kompatibilität 1,8
Meine build.grandle sieht aus wie dieses
anwenden Plugin: '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'
}
Dies ist alles auf Android Studio 3.0. Danke.
Noch ein Problem mit dem gleichen Fehler. Ich habe ein einfaches POJO namens Tester mit einer Methode doStuff erstellt. Tester t = neuer Tester(); deviceModel.initServerCredentials (tokenId, t :: doStuff); – user3835102
sollte es funktionieren. Was ist das Problem? –
; (Ich finde das Problem. Das Problem ist, dass Sie denken, es ruft 'dostuff' und return 1, aber es tut das nicht. Es ist nur ein Verweis auf die Methode selbst. Im Beispiel von [ORACLE-Webseite] (https: //docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html), nimmt die 'sort' Methode eine Funktion als zweiten Parameter an.Verstehst du was ich meine? –