2017-10-03 8 views
1

Google에서 직접 작성한 this 자습서를 따라 왔습니다.람다 식을 사용하지 않고 새로운 Android 아키텍처를 사용하는 방법은 무엇입니까?

현재 문제는 클래스에있는 userDao.save(response.body()); 줄입니다.

private void refreshUser(final String userId) { 
     executor.execute(() -> { 
      // running in a background thread 
      // check if user was fetched recently 
      boolean userExists = userDao.hasUser(FRESH_TIMEOUT); 
      if (!userExists) { 
       // refresh the data 
       Response response = webservice.getUser(userId).execute(); 
       // TODO check for error etc. 
       // Update the database.The LiveData will automatically refresh so 
       // we don't need to do anything else here besides updating the database 
       userDao.save(response.body()); 
      } 
     }); 
    } 

Android Studio 버전에서 시도 할 때 람다식이이 언어 수준에서 지원되지 않는다는 메시지가 나타납니다.

enter image description here

내가 that 같은 자바 (8)를 지원하기 위해 내 안드로이드 Studio를 업그레이드 할 수 있다는 사실을 알고,하지만 - 그렇게 할 수있는 다른 방법은 무엇입니까? 람다 식을 사용하기 위해 Java 8로 업그레이드하고 싶지 않습니다.

+0

왜 Java * 8로 업그레이드하지 않겠습니까? 모든 이전 버전은 수명이 다되었습니다! –

+0

@JoeC 그건 예외가 아니야, 내 ide의 메시지지만, 당신의 대답에 감사드립니다. – romaneso

+1

@JoeC 안드로이드의 java 8이 아직 베타 버전이기 때문에 베타 버전을 사용하면 다소 불안해집니다. – romaneso

답변

3

, 수동으로 대체 할 수

executor.execute(() -> { 
    // task... 
}); 

로 :

executor.execute(new Runnable() { 
    @Override 
    public void run() { 
     // task... 
    } 
}); 
+1

어떻게 그렇게 눈을 멀게 할 수 있었습니까?! 나는 내 Runnable이 람다 클래스라는 것을 알지 못했다. 실제로 너는 내 눈을 열어 나를 도왔다. 고마워요! – romaneso

+1

문제 없습니다. 익명의 내부 클래스 대신에 람다를 사용할 수 있습니다. 특히 청취자를 클릭하십시오 :'button.setOnClickListener (v -> {// code});' – chornge

+0

그래, 나는 그 사실을 알고 있었지만 안드로이드는 그렇지 않다는 것을 알고 있었다. 지원 자바 8 (릴리스 후보와 함께) 내가 lambas를 건너 뛰게합니다. – romaneso

2

executorExecutor의 인스턴스입니다. execute() takes a Runnable. 따라서 람다 표현식을 Runnable으로 대체하십시오. 자바 (8) (당신은 재고해야하는)를 사용하지 않으려면

4

가정하면,이 람다를 사용하려면 두 옵션의 대답은 당신이 필요로하는

2.3.3 낮은

먼저 당신의 AS 버전을 기반으로 잭을 사용 가능하게하고 Java 8을 사용하십시오. 잭은 공식적으로 더 이상 사용되지 않지만 AS 2.3.3 이하에서는 Java 8을 가져 오는 유일한 옵션입니다 (실제로는 버그가 있습니다. 람다이 포스트의 단부)에서 설명 된 라이브러리를 사용하여 Java 7의 (또는 아래)에서 사용될 수있다 :이 쓸 때

android { 
    ... 
    defaultConfig { 
     ... 
     jackOptions { 
      enabled true 
     } 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 
} 

3.0 (베타) 및 3.0 AS

상술없이 자바 8 지원 잭 활성화 필요. 그래서 당신이 필요로하는 모든입니다

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_8 
    targetCompatibility JavaVersion.VERSION_1_8 
} 

는 지금 람다를 사용할 수 있습니다, 당신은 자바 (8)가 설치되어 가정.

다른 해결 방법 (Java 8을 컴파일 할 수 없거나 완전히 다른 이유로 다루지 않으려는 경우)은 chornge이 람다 또는 Java 8을 사용하지 말고 그냥 사용한다고 대답했습니다. 익명의 내부 클래스 시스템. 사이드 노트에

대체

, 당신은 자바 8을 사용하기를 원하지만 람다를 사용하지 않는 게시물에 썼다. 이론적으로는 직접 테스트하지 않은 상태에서 retrolambda을 사용할 수 있습니다. Java 용 람다 지원을 추가 한 라이브러리입니다. < = 7

+0

Retrolambda는 완벽하게 작동하지만 Jack은 더 이상 사용되지 않습니다. – EpicPandaForce

+0

잭이 더 이상 사용되지 않는다는 것을 알고 있지만 여전히 AS = 2.3.3에서 Java 8을 얻는 유일한 옵션입니다. AS> = 3.0은 잭이없는 Java 8을 허용합니다. 낮은 버전의 AS에서는 여전히 더 이상 사용하지 않는 잭을 사용해야합니다 (AS 2.3.3을 사용하는 잭이없는 Java 8을 사용하려고했지만 잭이 여전히 필요함을 보여줍니다). 3.0 잭에서만 사용 중지되었습니다 – Zoe

+0

Retrolambda 또한 당신에게 람다 지원을 제공합니다. 그리고 그 과정에서 일을 깨뜨리지도 않습니다. 그래서 나는 잭을 사용하지 말 것을 권한다. 공식적으로 사용되지 않습니다. http://tools.android.com/tech-docs/jackandjill – EpicPandaForce