RxCache 사용 필드 기록
15638 단어 Android 진급 지식android
하나의 수요, 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>>>(){}))
}
후기 지속 업데이트
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Shirates에서 상대 선택기를 사용하는 방법 - 1부 -이것은 간단하고 강력한 표현입니다(참조). 오른쪽, 아래, 왼쪽, 위 방향으로 상대적으로 위젯을 얻을 수 있습니다. 올바른 방향의 위젯 올바른 방향으로 입력 라벨을 올바른 방향으로 올바른 방향으로 이미지 :오른쪽 버...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.