RxCache 사용 필드 기록

장면
하나의 수요, UI 데 이 터 를 구축 할 때 데 이 터 를 조립 해 야 합 니 다. 우 리 는 데 이 터 를 두 가지 로 나 누 었 습 니 다. 하 나 는 설정 데이터 이 고 하 나 는 UI 프레임 워 크 데이터 입 니 다.프레임 데 이 터 는 설정 데이터 에 의존 하여 데이터 조립 을 하고 데이터 특성 은 장기 적 으로 변 하지 않 습 니 다.이 기능 에 대하 여 우 리 는 설정 데이터 json 을 로 컬 에 저장 하고 기한 을 초과 하 는 시간 을 설정 할 수 있 으 며 자주 네트워크 접근 을 하지 않 아 도 됩 니 다.
이에 저 희 는 Rxcache 라 이브 러 리 를 사용 합 니 다. 이 라 이브 러 리 는 주 해 된 설정 을 통 해 네트워크 데 이 터 를 작성 파일 디 렉 터 리 에 저장 할 수 있 습 니 다.구체 적 인 사용법 은 '안 드 로 이 드 Rxcache 사용 상세 설명' 을 참고 하면 된다.
구 덩이 를 밟다
설정 과정 에서 저 는 위의 방식 으로 직접 접근 하지 않 았 습 니 다. 형식 변환 오류 가 발생 했 습 니 다. 저 장 된 json 데 이 터 를 분석 하 는 과정 에서 저 장 된 텍스트 파일 에 전의 문자 가 저장 되 지 않 아 읽 을 때 오류 가 발생 했 기 때 문 입 니 다.
//  json      
data{
 code:1
 data:[
   {name:"martin"}
  ]
}

구체 적 인 해결 방안 은 네트워크 데이터 가 되 돌아 오 는 String 을 우선 저장 하고 파일 형식 을 보 여 주 는 것 입 니 다.
\"data\"{
  \"code\":1
 \"data\":[
   {\"name\":\"martin\"}
  ]
}

위의 처 리 를 거 친 후 스 트림 을 읽 는 방식 으로 gs on 도 구 를 통 해 변환 합 니 다.부분 코드 는 다음 과 같 습 니 다.
//    
interface ApiService{
	//     String
	@POST(AppConstant.UrlString.URL_GET_ALL_CONTACT_SOURCE)
    fun getAllContactSources(): Observable<String>
} 

//    
@EncryptKey("tagDisplayCache")
interface ApiCacheService{
	
	//       5  
    @ProviderKey("cacheCustomerSource")
    @LifeCache(duration = 5, timeUnit = TimeUnit.MINUTES)
    fun cacheCustomerSources(
    	//      
        observable: Observable<String>,
        number: DynamicKey,
        evictDynamicKey: EvictDynamicKey
    ): Observable<String>
}
//ComposeString2Obj,    
public class ComposeString2Obj<T> implements ObservableTransformer<String,DataResponse<T>> {

     public TypeToken<DataResponse<T>> typeToken;

     public static ComposeString2Obj newCompose(TypeToken typeToken) {
        return new ComposeString2Obj(typeToken);
    }

    public ComposeString2Obj(TypeToken<DataResponse<T>> typeToken) {
        this.typeToken = typeToken;
    }

    @Override
    public ObservableSource<DataResponse<T>> apply(Observable<String> responseObservable) {
        return responseObservable
                .flatMap(new ReadListFunc<>(typeToken))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }

    //       
     private static class ReadListFunc<E> implements Function<String, Observable<DataResponse<E>>> {

         private TypeToken<DataResponse<E>> typeToken;

         public ReadListFunc(TypeToken<DataResponse<E>> typeToken) {
             this.typeToken = typeToken;
         }


        @Override
        public Observable<DataResponse<E>> apply(String s) {
            DataResponse<E> response = new Gson().fromJson(s, typeToken.getType());
            if (response != null && response.getCode() == DataResponse.CODE_SUCCESS) {
                return Observable.just(response);
            } else {
                return Observable.error(new Throwable());
            }
        }
    }

 }
//    
fun main(){
	 ApiServiceManager.getInstance().getApiCache(ApiCacheService::class.java)
            .cacheCustomerSources(
                ApiServiceManager.getInstance()
                    .getApiService(ApiService::class.java).getAllContactSources(),
                    //  
                DynamicKey(AppConstant.UrlString.URL_GET_ALL_CONTACT_SOURCE),
                EvictDynamicKey(isRefresh)
            ).compose(ComposeString2Obj(object:TypeToken<DataResponse<MutableList<MapBean>>>(){}))
}

후기 지속 업데이트

좋은 웹페이지 즐겨찾기