Retrofit2 : recyclerview에서 다음 작업을 실행하기 전에 응답을 기다립니다.

스왑 나 엔

나는 recyclerview를 사용하여 항목 (이미지 및 텍스트) 목록을 표시하고 있으며 백엔드에서 recyclerview 목록에 표시된 항목을 가져오고 있으며 나머지 호출을 위해 retrofit2를 사용하고 있으며 나머지에서 목록을 가져올 수 있으며 recyclerview는 완벽하게 잘 표현되었습니다.

recyclerview에 항목 목록을 표시하는 동안 항목에있는 이미지에 비트 맵 이미지를 추가하고 싶습니다. 이 비트 맵 이미지를 항목에있는 이미지에 추가하기 전에 비트 맵 이미지가 해당 항목에 필요한지 여부를 확인하기 위해 두 번째 개조 호출 (비동기)을 만들어야합니다. 응답이 참이면 비트 맵 이미지 만 추가하면됩니다.

이제 문제는 개조에서 비동기 호출 (인큐 메서드 사용)을 할 때 리사이클 러 뷰가 개조의 응답을 기다리고 있지 않기 때문에 각 항목에있는 이미지에 비트 맵을 그릴 수 없다는 것입니다.

동기 호출을 사용하여 문제를 해결할 수 있다는 것을 알고 있지만 성능을 타협하고 싶지 않습니다.

아래는 참조 용 코드 스 니펫입니다.

항목 이미지에 비트 맵을 그리려는 반환 값을 기반으로 부울을 반환하는 recyclerview 어댑터에서 retrofit 메서드를 호출합니다.

개조 방법 :

HttpRestServiceConsumer.getBaseApiInterface(false)
    .getTestWithURL(imageURL)
    .enqueue(new Callback<TestResponse>() {

        @Override
        public void onResponse(Call<TestResponse> call, Response<TestResponse> response) {

            try {
                if (response.isSuccessful()) {

                    data = response.body().getTrackElements();

                    if (response.body().getTrackElements().size() > 0) 

                          testExist = true;

                   else 

                    testExist=false;


            } catch (Exception e) {

            }

        }

        @Override
        public void onFailure(Call<TestResponse> call, Throwable t) {

        }
주조

나는 당신이 호출 클래스에 등록하기 위해 존재 테스트를 받고 싶다고 생각합니다. 이를 수행하는 한 가지 방법은 인터페이스를 선언하는 것입니다.

public interface GetTestWithURLCompletion {
    public void getTestWithURLCompletion(boolean success);
}

호출 클래스는이 인터페이스를 채택해야합니다.

public class CustomClass implements GetTestWithURLCompletion  {

   public void getTestWithURLCompletion(boolean success) {
         if (success) // do something
   }
}

URL 함수는 호출자를 매개 변수로 받아 들여야합니다.

    public void getTestWithURL(String imageURL, GetVeepWithURLCallback caller);

호출 클래스는 getTestWithURL 호출의 일부로 자신에 대한 참조를 보냅니다.

    webServiceManager.getTestWithURL(imageURL, this);

그런 다음 getTestWithURL다시 호출하여 호출 클래스의 인터페이스를 호출 할 수 있습니다.

 caller.getTestWithURLCompletion(testExist);

전체 예제는 다음과 같습니다.

//interface
public interface GetTestWithURLCompletion {
    public void getTestWithURLCompletion(boolean success);
}

//api access class
public class ApiManager {

    //getTestWithURL
    public void getTestWithURL(String imageURL, GetVeepWithURLCallback caller) {

    HttpRestServiceConsumer.getBaseApiInterface(false)
    .getTestWithURL(imageURL)
    .enqueue(new Callback<TestResponse>() {

        @Override
        public void onResponse(Call<TestResponse> call, Response<TestResponse> response) {

            try {
                if (response.isSuccessful()) {

                    data = response.body().getTrackElements();

                    if (response.body().getTrackElements().size() > 0) {
                      caller.getTestWithURLCallback(true);
                    } else {
                      caller. getTestWithURLCallback(false);
                   }
            } catch (Exception e) {

            }
        }
        @Override
        public void onFailure(Call<TestResponse> call, Throwable t) {
        }
   }
}


//calling class
public class CustomClass implements GetTestWithURLCompletion  {

   //calling function
   public void someFunction {
       apiManager.getTestWithURL(imageURL, this)
  }

   //callback function
   public void getTestWithURLCompletion(boolean success) {
         if (success) // do something
   }
}

Java 전문가 (저는 그들 중 한 사람이 아닙니다)는 익명 함수 또는 람다 식을 사용하여 예제를 통해이 답변을 향상시킬 수 있습니다. 익명 함수를 getTestWithUrl에 전달하면 별도의 콜백 함수를 제공하지 않아도되며이 패턴을 더 이식 할 수 있습니다. 다음과 같이 보일 수 있습니다.

apiManager.getTestWithUURL(imageURL,(boolean success) -> {
             if (success) // do something
})

(이 구문은 확실히 잘못되었습니다-의사 코드로 취급하십시오!)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ionic 2에서 다음에 계속하기 위해 foreach의 실행을 기다립니다.

분류에서Dev

Retrofit2 및 Gson이 logcat에 응답하지 않습니다.

분류에서Dev

for 루프에서 여러 발리 응답을 기다립니다.

분류에서Dev

UI를 표시하기 전에 수행 할 작업을 기다립니다.

분류에서Dev

다음 작업을 실행하기 전에 x 초 동안 절전 모드

분류에서Dev

내부 함수를 호출하지만 계속 진행하기 전에 응답을 기다립니다.

분류에서Dev

비동기 작업을 시작한 다음 나중에 기다립니다.

분류에서Dev

다른 작업을 실행하기 전에 작업을 완료하는 방법

분류에서Dev

NodeJ를 사용하여 익스프레스에서 렌더링을 실행하기 전에 비동기 작업을 기다립니다.

분류에서Dev

GNU Parallel은 시작하기 전에 n 개의 작업을 기다립니다.

분류에서Dev

Apache Airflow에서 이전 실행의 모든 다운 스트림 작업을 기다립니다.

분류에서Dev

다른 기능을 실행하기 전에 비동기 기능이 종료 될 때까지 기다립니다.

분류에서Dev

각도 js의 다른 구성 요소에서 응답을 기다립니다.

분류에서Dev

다음 작업을 실행하기 전에 요청이 완료되기를 기다리는 중

분류에서Dev

VueJs-페이지를 다시로드하기 전에 OPTION 응답을 기다립니다.

분류에서Dev

계속하기 전에 Dexie 테이블 조회에 대한 응답을 기다립니다.

분류에서Dev

다음 작업을 실행하기 전에 요청이 완료 될 때까지 기다리는 방법 (Xcode 11)

분류에서Dev

명령을 병렬로 실행하고 다음 명령을 시작하기 전에 한 명령 그룹이 완료 될 때까지 기다립니다.

분류에서Dev

Python은 앱을 실행하고 상호 작용하기 전에로드 될 때까지 기다립니다.

분류에서Dev

다음 작업을 수행하기 전에 jquery를 기다리십시오

분류에서Dev

Rxjs는 진행하기 전에 이전 간격 요청 실행을 기다립니다.

분류에서Dev

다른 작업을 실행하기 전에 하나의 크론 작업을 어떻게 종료합니까?

분류에서Dev

Qt websocket은 메시지를 보내고 다음 방법으로 이동하기 전에 응답을 기다립니다.

분류에서Dev

사용자 작업을 기록한 다음 JavaScript에서 다시 실행하는 방법은 무엇입니까?

분류에서Dev

Android / Java-다음 기능을 수행하기 전에 AsyncTask가 종료 될 때까지 기다립니다.

분류에서Dev

Kotlin Coroutine은 Retrofit 응답을 기다립니다.

분류에서Dev

즉시 작업을 실행 한 다음 기다립니다.

분류에서Dev

Windows 7에서 시작시 작업을 실행하기 전에 네트워킹을 기다리는 방법

분류에서Dev

bash에서 작업 제출; 다음 작업을 제출하기 전에 보류

Related 관련 기사

  1. 1

    ionic 2에서 다음에 계속하기 위해 foreach의 실행을 기다립니다.

  2. 2

    Retrofit2 및 Gson이 logcat에 응답하지 않습니다.

  3. 3

    for 루프에서 여러 발리 응답을 기다립니다.

  4. 4

    UI를 표시하기 전에 수행 할 작업을 기다립니다.

  5. 5

    다음 작업을 실행하기 전에 x 초 동안 절전 모드

  6. 6

    내부 함수를 호출하지만 계속 진행하기 전에 응답을 기다립니다.

  7. 7

    비동기 작업을 시작한 다음 나중에 기다립니다.

  8. 8

    다른 작업을 실행하기 전에 작업을 완료하는 방법

  9. 9

    NodeJ를 사용하여 익스프레스에서 렌더링을 실행하기 전에 비동기 작업을 기다립니다.

  10. 10

    GNU Parallel은 시작하기 전에 n 개의 작업을 기다립니다.

  11. 11

    Apache Airflow에서 이전 실행의 모든 다운 스트림 작업을 기다립니다.

  12. 12

    다른 기능을 실행하기 전에 비동기 기능이 종료 될 때까지 기다립니다.

  13. 13

    각도 js의 다른 구성 요소에서 응답을 기다립니다.

  14. 14

    다음 작업을 실행하기 전에 요청이 완료되기를 기다리는 중

  15. 15

    VueJs-페이지를 다시로드하기 전에 OPTION 응답을 기다립니다.

  16. 16

    계속하기 전에 Dexie 테이블 조회에 대한 응답을 기다립니다.

  17. 17

    다음 작업을 실행하기 전에 요청이 완료 될 때까지 기다리는 방법 (Xcode 11)

  18. 18

    명령을 병렬로 실행하고 다음 명령을 시작하기 전에 한 명령 그룹이 완료 될 때까지 기다립니다.

  19. 19

    Python은 앱을 실행하고 상호 작용하기 전에로드 될 때까지 기다립니다.

  20. 20

    다음 작업을 수행하기 전에 jquery를 기다리십시오

  21. 21

    Rxjs는 진행하기 전에 이전 간격 요청 실행을 기다립니다.

  22. 22

    다른 작업을 실행하기 전에 하나의 크론 작업을 어떻게 종료합니까?

  23. 23

    Qt websocket은 메시지를 보내고 다음 방법으로 이동하기 전에 응답을 기다립니다.

  24. 24

    사용자 작업을 기록한 다음 JavaScript에서 다시 실행하는 방법은 무엇입니까?

  25. 25

    Android / Java-다음 기능을 수행하기 전에 AsyncTask가 종료 될 때까지 기다립니다.

  26. 26

    Kotlin Coroutine은 Retrofit 응답을 기다립니다.

  27. 27

    즉시 작업을 실행 한 다음 기다립니다.

  28. 28

    Windows 7에서 시작시 작업을 실행하기 전에 네트워킹을 기다리는 방법

  29. 29

    bash에서 작업 제출; 다음 작업을 제출하기 전에 보류

뜨겁다태그

보관