>

그런 경우가 있습니다. 사용자는 버튼을 클릭하여 요청 체인을 시작합니다. 그런 다음 두 장의 사진을 업로드합니다. 그러나 사진 업로드를 시작한 후 돌아가서 프로세스를 다시 시작할 수 있습니다.

CompositeDisposable ()이 viewMode에 첨부되어l onCleared () 이후에만 지워집니다. 이상한 문제가 발생하는 이유는 다음과 같습니다. 사용자가 사진 업로드를 시작하고돌아가서 다시 시작하고 이전 요청의이전 요청에 대한 응답이 전달되고새로운 요청이 업로드되기 전에 !

모든 정규 RxJava 요청과 zip 연산자를 수정하여 오래된 요청이 아닌 새로운 요청 만 보도록 어떻게해야합니까?

각 버튼 이벤트 전에CompositeDisposable.dispose ()를 호출 할 수 없습니다. 업로드 프로세스가 종료되기 때문입니다.

가능한 오래된 응답 만 처리하면됩니다.

내 샘플은 다음과 같습니다 :

//called two times, for uploading
fun uploadPhoto(){
compositeDisposable.add(
            apiService.networkRequest(linkedHashMap, url)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeWith(object: DisposableSingleObserver<retrofit2.Response<String>>() {
                        override fun onSuccess(t: retrofit2.Response<String>) {
                            // will provide result even if two new uploadPhoto() methods gets called
                            handleResponse(t)
                        }
                        override fun onError(e: Throwable) {
                        }
                    }))
}
}

fun handleResponse(response: retrofit2.Response<String>)
{
    responseList.add(response) //saves number of responses
    if(responseList.size == 2)
    {
        //calls new network request and creates a new logic. 
    }
}

문제는 uploadPhoto ()가 이전 결과를 반환 한 후 handleResponse ()가 호출된다는 것입니다

  • 답변 # 1

    좋아요, 귀하의 사례를 올바르게 이해했다면 첫 번째 업로드에서 응답을 삭제하고 두 번째에서 응답을 고려하거나 일반화하십시오 : 이전의 모든 응답을 무시하고 최신 만 고려하십시오.

    그렇다면 간단한 해결책은 compositeDisposable 를 확인하는 것입니다.  새 업로드를 시작하기 전에 목록이 비어 있지 않으면 모든 것을 버리고 새 일회용품을 추가하십시오.

    이와 같은 것 :

    fun uploadPhoto(){
       if(compositeDisposable.size() > 0){
           compositeDisposable.clear()
       }
       // ...
    }
    
    

    compositeDisposable.clear() 사용에주의   .dispose() 가 아님 .

    다음 질문에 대해 :

    그래서 compositeDisposable.clear()  목록에있는 모든 항목을 처리합니다. 더 구체적으로 이것은 작업 스레드가 중단되고 예를 들어 업로드 프로세스가 종료됨을 의미합니다.

    업로드를 계속하려면 일회용품을 청소하는 것 이외의 다른 메커니즘을 사용해야합니다.

    Rx에서 그렇게 할 수 있는지 잘 모르겠지만 Rx를 포함하지 않는 아이디어는 일종의 uploadId 를 갖는 것입니다. 각 업로드와 관련된 임의의 해시처럼 생성됩니다. 이 ID는 네트워킹 계층에 제공된 다음 응답으로 다시 전달되어야합니다.

    그런 다음 ViewModel 에  당신은 currentUploadId 를 추적합니다 및 :

    사용자가 새 업로드를 수행 할 때마다 currentUploadId 를 업데이트하십시오.  새로 생성 된 ID

    와이즈 비즈  당신이받습니다 handleResponse(...) 확인   response.uploadId 와 함께 그들이하지 않으면 일치하면이 응답을 삭제하기 만하면됩니다.

    currentUploadId

  • 이전 javascript - MongoDB에서 $where가있는 문서 수 계산
  • 다음 macos - Mac OSX에서 $GOPATH를 설정할 수 없습니다