2017-11-05 3 views
0

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.

Antwort

0

Dies ist nicht der Fall für die Verwendung/versuchen diese Funktion. In einfachen Worten, Sie möchten etwas referenzieren, wenn Sie weg sind außerhalb Klasse (nicht innerhalb). Wenn Sie eine Methode innerhalb der Klasse referenzieren möchten, rufen Sie einfach einfach dostuff oder this.dostuff. Wenn Sie dies üben möchten, können Sie so etwas wie folgt vorgehen:

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

Die Methode dostuff nicht statisch ist, so definiere ich ein Objekt. Sie können dies mit einer statischen Methode und nur mit dem Klassennamen tun.

+0

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

+0

sollte es funktionieren. Was ist das Problem? –

+0

; (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? –