나는 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] 삭제
몇 마디 만하겠습니다