Skip to content

Commit 124d6fe

Browse files
author
alafighting
committed
实现对缓存策略的支持
1 parent cd75ad1 commit 124d6fe

File tree

10 files changed

+175
-67
lines changed

10 files changed

+175
-67
lines changed

app/src/main/java/com/im4j/kakacache/rxjava/demo/MainActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.widget.Button;
88

99
import com.im4j.kakacache.rxjava.netcache.RxRemoteCache;
10+
import com.im4j.kakacache.rxjava.netcache.strategy.FirstCacheStrategy;
1011

1112
import java.util.concurrent.TimeUnit;
1213

@@ -26,7 +27,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
2627

2728
btnTest = (Button) findViewById(R.id.btn_test_cache);
2829
btnTest.setOnClickListener(view -> {
29-
RxRemoteCache.cache(remote(), KEY_CACHE).subscribe(data -> {
30+
remote().compose(RxRemoteCache.transformer(KEY_CACHE, new FirstCacheStrategy())).subscribe(data -> {
3031
Log.e("main", "next data="+data);
3132
}, error -> {
3233
Log.e("main", "error", error);

library/src/main/java/com/im4j/kakacache/rxjava/core/CacheTarget.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ public enum CacheTarget {
99
NONE,
1010
Memory,
1111
Disk,
12-
MemoryDisk;
12+
MemoryAndDisk;
1313

1414
public boolean supportMemory() {
15-
return this==Memory || this==MemoryDisk;
15+
return this==Memory || this== MemoryAndDisk;
1616
}
1717

1818
public boolean supportDisk() {
19-
return this==Disk || this==MemoryDisk;
19+
return this==Disk || this== MemoryAndDisk;
2020
}
2121

2222
}

library/src/main/java/com/im4j/kakacache/rxjava/manager/RxCacheManager.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ public final void call(Subscriber<? super T> subscriber) {
1919
try {
2020
execute(subscriber);
2121
} catch (Throwable e) {
22-
subscriber.onError(e);
22+
onError(subscriber, e);
2323
return;
2424
}
2525

2626
subscriber.onCompleted();
2727
}
2828
abstract void execute(Subscriber<? super T> subscriber);
29+
abstract void onError(Subscriber<? super T> subscriber, Throwable e);
2930
}
3031

3132

@@ -42,11 +43,12 @@ public <T> rx.Observable<T> load(final String key) {
4243
@Override
4344
void execute(Subscriber<? super T> subscriber) {
4445
T value = _load(key);
45-
// if (value == null) {
46-
// subscriber.onError(new NotFoundException("找不到缓存’"+key+"'"));
47-
// }
4846
subscriber.onNext(value);
4947
}
48+
@Override
49+
void onError(Subscriber<? super T> subscriber, Throwable e) {
50+
subscriber.onNext(null);
51+
}
5052
}).subscribeOn(Schedulers.computation());
5153
}
5254

@@ -61,6 +63,10 @@ void execute(Subscriber<? super Boolean> subscriber) {
6163
_save(key, value, expires, target);
6264
subscriber.onNext(true);
6365
}
66+
@Override
67+
void onError(Subscriber<? super Boolean> subscriber, Throwable e) {
68+
subscriber.onNext(false);
69+
}
6470
});
6571
}
6672

@@ -76,6 +82,10 @@ void execute(Subscriber<? super Boolean> subscriber) {
7682
boolean value = _containsKey(key);
7783
subscriber.onNext(value);
7884
}
85+
@Override
86+
void onError(Subscriber<? super Boolean> subscriber, Throwable e) {
87+
subscriber.onNext(false);
88+
}
7989
});
8090
}
8191

@@ -90,6 +100,10 @@ void execute(Subscriber<? super Boolean> subscriber) {
90100
_remove(key);
91101
subscriber.onNext(true);
92102
}
103+
@Override
104+
void onError(Subscriber<? super Boolean> subscriber, Throwable e) {
105+
subscriber.onNext(false);
106+
}
93107
});
94108
}
95109

@@ -103,6 +117,10 @@ void execute(Subscriber<? super Boolean> subscriber) {
103117
_clear();
104118
subscriber.onNext(true);
105119
}
120+
@Override
121+
void onError(Subscriber<? super Boolean> subscriber, Throwable e) {
122+
subscriber.onNext(false);
123+
}
106124
});
107125
}
108126

library/src/main/java/com/im4j/kakacache/rxjava/netcache/CacheTransformer.java

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.im4j.kakacache.rxjava.netcache;
2+
3+
/**
4+
* 数据
5+
* @version alafighting 2016-06
6+
*/
7+
public class ResultData<T> {
8+
9+
public ResultFrom from;
10+
public String key;
11+
public T data;
12+
13+
public ResultData(ResultFrom from, String key, T data) {
14+
this.from = from;
15+
this.key = key;
16+
this.data = data;
17+
}
18+
19+
public ResultFrom getFrom() {
20+
return from;
21+
}
22+
23+
public void setFrom(ResultFrom from) {
24+
this.from = from;
25+
}
26+
27+
public String getKey() {
28+
return key;
29+
}
30+
31+
public void setKey(String key) {
32+
this.key = key;
33+
}
34+
35+
public T getData() {
36+
return data;
37+
}
38+
39+
public void setData(T data) {
40+
this.data = data;
41+
}
42+
43+
@Override
44+
public String toString() {
45+
return "ResultData{" +
46+
"from=" + from +
47+
", key='" + key + '\'' +
48+
", data=" + data +
49+
'}';
50+
}
51+
52+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.im4j.kakacache.rxjava.netcache;
2+
3+
/**
4+
* 数据来源
5+
* @version alafighting 2016-06
6+
*/
7+
public enum ResultFrom {
8+
Remote, Cache
9+
}

library/src/main/java/com/im4j/kakacache/rxjava/netcache/RxRemoteCache.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.im4j.kakacache.rxjava.core.memory.journal.LRUMemoryJournal;
1313
import com.im4j.kakacache.rxjava.core.memory.storage.SimpleMemoryStorage;
1414
import com.im4j.kakacache.rxjava.manager.RxCacheManager;
15+
import com.im4j.kakacache.rxjava.netcache.strategy.CacheStrategy;
1516

1617
import java.io.File;
1718

@@ -59,13 +60,30 @@ public static <T> rx.Observable<Boolean> save(String key, T value, CacheTarget t
5960
}
6061

6162
public static <T> rx.Observable<Boolean> save(String key, T value) {
62-
return save(key, value, CacheTarget.MemoryDisk);
63+
return save(key, value, CacheTarget.MemoryAndDisk);
6364
}
6465

6566

6667

67-
public static <T> Observable<CacheTransformer.CacheData<T>> cache(Observable<T> observable, String key) {
68-
return observable.compose(new CacheTransformer<>(key));
68+
public static <T> Observable.Transformer<T, ResultData<T>> transformer(String key, CacheStrategy strategy) {
69+
return new CacheTransformer<T>(key, strategy);
70+
}
71+
72+
73+
74+
private static class CacheTransformer<T> implements Observable.Transformer<T, ResultData<T>> {
75+
private String key;
76+
private CacheStrategy<T> strategy;
77+
78+
public CacheTransformer(String key, CacheStrategy<T> strategy) {
79+
this.key = key;
80+
this.strategy = strategy;
81+
}
82+
83+
@Override
84+
public Observable<ResultData<T>> call(Observable<T> source) {
85+
return strategy.execute(key, source);
86+
}
6987
}
7088

7189
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.im4j.kakacache.rxjava.netcache.strategy;
2+
3+
import android.util.Log;
4+
5+
import com.im4j.kakacache.rxjava.netcache.ResultData;
6+
import com.im4j.kakacache.rxjava.netcache.ResultFrom;
7+
import com.im4j.kakacache.rxjava.netcache.RxRemoteCache;
8+
9+
import rx.Observable;
10+
11+
/**
12+
* 缓存策略基类
13+
* @version alafighting 2016-06
14+
*/
15+
abstract class BasicCacheStrategy<T> implements CacheStrategy {
16+
17+
Observable<ResultData<T>> loadCache(String key) {
18+
return RxRemoteCache.load(key).map(it -> new ResultData<>(ResultFrom.Cache, key, (T) it));
19+
}
20+
21+
Observable<ResultData<T>> loadRemote(String key, Observable<T> source) {
22+
return source.map(it -> {
23+
RxRemoteCache.save(key, it).subscribe(status -> Log.e("save status", "status="+status) );
24+
Log.e("transformer", "save key="+key+", value="+it);
25+
return new ResultData<T>(ResultFrom.Remote, key, it);
26+
});
27+
}
28+
29+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.im4j.kakacache.rxjava.netcache.strategy;
2+
3+
import com.im4j.kakacache.rxjava.netcache.ResultData;
4+
5+
import rx.Observable;
6+
7+
/**
8+
* 缓存策略
9+
* @version alafighting 2016-06
10+
*/
11+
public interface CacheStrategy<T> {
12+
13+
public Observable<ResultData<T>> execute(String key, Observable<T> source);
14+
15+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.im4j.kakacache.rxjava.netcache.strategy;
2+
3+
import com.im4j.kakacache.rxjava.netcache.ResultData;
4+
5+
import rx.Observable;
6+
import rx.schedulers.Schedulers;
7+
8+
/**
9+
* 优先缓存
10+
* @version alafighting 2016-06
11+
*/
12+
public class FirstCacheStrategy<T> extends BasicCacheStrategy<T> {
13+
14+
@Override
15+
public Observable<ResultData<T>> execute(String key, Observable source) {
16+
return Observable.concat(
17+
loadCache(key),
18+
loadRemote(key, source)
19+
).first(it -> ((ResultData<T>)it).data != null).subscribeOn(Schedulers.io());
20+
}
21+
22+
}

0 commit comments

Comments
 (0)