Skip to content

Commit cd75ad1

Browse files
author
alafighting
committed
实现对网络数据的缓存
1 parent 54a3221 commit cd75ad1

File tree

9 files changed

+185
-44
lines changed

9 files changed

+185
-44
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="com.im4j.kakacache.rxjava.demo">
33

4+
<uses-permission android:name="android.permission.INTERNET" />
5+
46
<application
57
android:allowBackup="true"
68
android:icon="@mipmap/ic_launcher"

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

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,41 @@
33
import android.os.Bundle;
44
import android.support.annotation.Nullable;
55
import android.support.v7.app.AppCompatActivity;
6+
import android.util.Log;
7+
import android.widget.Button;
8+
9+
import com.im4j.kakacache.rxjava.netcache.RxRemoteCache;
10+
11+
import java.util.concurrent.TimeUnit;
612

713
/**
814
* Demo主界面
915
* @version alafighting 2016-06
1016
*/
1117
public class MainActivity extends AppCompatActivity {
18+
static final String KEY_CACHE = "key_cache";
19+
20+
private Button btnTest;
1221

1322
@Override
1423
protected void onCreate(@Nullable Bundle savedInstanceState) {
1524
super.onCreate(savedInstanceState);
25+
setContentView(R.layout.actiity_main);
1626

17-
// CacheCore.Builder builder = new CacheCore.Builder();
18-
// CacheCore manager = builder.create();
19-
//
20-
// manager.save("test1", "value123");
21-
// manager.save("boolean1", true);
27+
btnTest = (Button) findViewById(R.id.btn_test_cache);
28+
btnTest.setOnClickListener(view -> {
29+
RxRemoteCache.cache(remote(), KEY_CACHE).subscribe(data -> {
30+
Log.e("main", "next data="+data);
31+
}, error -> {
32+
Log.e("main", "error", error);
33+
}, () -> {
34+
Log.e("main", "completed");
35+
});
36+
});
2237
}
38+
39+
private rx.Observable<String> remote() {
40+
return rx.Observable.just("test remote").delay(3, TimeUnit.SECONDS);
41+
}
42+
2343
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RelativeLayout
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:layout_width="match_parent"
5+
android:layout_height="match_parent">
6+
7+
<Button
8+
android:id="@+id/btn_test_cache"
9+
android:layout_width="wrap_content"
10+
android:layout_height="wrap_content"
11+
android:layout_centerHorizontal="true"
12+
android:text="测试缓存"/>
13+
14+
</RelativeLayout>

library/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="com.im4j.kakacache.rxjava">
33

4+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
5+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
6+
47
<application
58
android:allowBackup="true"
69
android:label="@string/app_name"

library/src/main/java/com/im4j/kakacache/rxjava/common/utils/Utils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ public static <T> T checkNotNull(T obj) {
2424
}
2525
return obj;
2626
}
27+
/**
28+
* 不为空
29+
*/
30+
public static <T> T checkNotNull(T obj, String message) {
31+
if (obj == null) {
32+
throw new NullException(message);
33+
}
34+
return obj;
35+
}
2736

2837
/**
2938
* 不小于0

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

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,4 @@ void _clear() throws CacheException {
7070
}
7171
}
7272

73-
74-
75-
/**
76-
* 构造器
77-
*/
78-
public static abstract class Builder {
79-
CacheCore cache;
80-
81-
public Builder(CacheCore cache) {
82-
this.cache = cache;
83-
}
84-
85-
public RxJavaCacheManager.Builder rxjava() {
86-
return new RxJavaCacheManager.Builder(cache);
87-
}
88-
89-
}
90-
9173
}

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

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.im4j.kakacache.rxjava.manager;
22

33
import com.im4j.kakacache.rxjava.common.exception.CacheException;
4-
import com.im4j.kakacache.rxjava.common.exception.NotFoundException;
54
import com.im4j.kakacache.rxjava.core.CacheCore;
65
import com.im4j.kakacache.rxjava.core.CacheTarget;
76

@@ -12,7 +11,7 @@
1211
* RxJava模式缓存管理
1312
* @version alafighting 2016-04
1413
*/
15-
public class RxJavaCacheManager extends CacheManager {
14+
public class RxCacheManager extends CacheManager {
1615

1716
private static abstract class SimpleSubscribe<T> implements rx.Observable.OnSubscribe<T> {
1817
@Override
@@ -30,7 +29,7 @@ public final void call(Subscriber<? super T> subscriber) {
3029
}
3130

3231

33-
public RxJavaCacheManager(CacheCore cache) {
32+
public RxCacheManager(CacheCore cache) {
3433
super(cache);
3534
}
3635

@@ -43,9 +42,9 @@ public <T> rx.Observable<T> load(final String key) {
4342
@Override
4443
void execute(Subscriber<? super T> subscriber) {
4544
T value = _load(key);
46-
if (value == null) {
47-
subscriber.onError(new NotFoundException("找不到缓存’"+key+"'"));
48-
}
45+
// if (value == null) {
46+
// subscriber.onError(new NotFoundException("找不到缓存’"+key+"'"));
47+
// }
4948
subscriber.onNext(value);
5049
}
5150
}).subscribeOn(Schedulers.computation());
@@ -107,19 +106,4 @@ void execute(Subscriber<? super Boolean> subscriber) {
107106
});
108107
}
109108

110-
111-
112-
/**
113-
* 构造器
114-
*/
115-
public static class Builder extends CacheManager.Builder {
116-
public Builder(CacheCore cache) {
117-
super(cache);
118-
}
119-
120-
public RxJavaCacheManager create() {
121-
return new RxJavaCacheManager(cache);
122-
}
123-
}
124-
125109
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.im4j.kakacache.rxjava.netcache;
2+
3+
import android.util.Log;
4+
5+
import rx.Observable;
6+
import rx.schedulers.Schedulers;
7+
8+
/**
9+
* 将Observable转换为自动处理缓存的源
10+
* @version alafighting 2016-06
11+
*/
12+
public class CacheTransformer<T> implements Observable.Transformer<T, CacheTransformer.CacheData<T>> {
13+
14+
private String key;
15+
public CacheTransformer(String key) {
16+
this.key = key;
17+
}
18+
19+
@Override
20+
public Observable<CacheData<T>> call(Observable<T> source) {
21+
return Observable.concat(
22+
RxRemoteCache.load(key).map(it -> new CacheData<T>(From.Cache, key, (T)it)),
23+
source.map(it -> {
24+
RxRemoteCache.save(key, it).subscribe(status -> Log.e("save status", "status="+status) );
25+
Log.e("transformer", "save key="+key+", value="+it);
26+
return new CacheData<T>(From.Remote, key, it);
27+
})
28+
).first(it -> it.data != null).subscribeOn(Schedulers.io());
29+
}
30+
31+
public static final class CacheData<T> {
32+
public From from;
33+
public String key;
34+
public T data;
35+
36+
public CacheData(From from, String key, T data) {
37+
this.from = from;
38+
this.key = key;
39+
this.data = data;
40+
}
41+
42+
@Override
43+
public String toString() {
44+
return "CacheData{" +
45+
"from=" + from +
46+
", key='" + key + '\'' +
47+
", data=" + data +
48+
'}';
49+
}
50+
}
51+
52+
public static enum From {
53+
Remote, Cache
54+
}
55+
56+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.im4j.kakacache.rxjava.netcache;
2+
3+
4+
import android.os.Environment;
5+
import android.util.Log;
6+
7+
import com.im4j.kakacache.rxjava.core.CacheCore;
8+
import com.im4j.kakacache.rxjava.core.CacheTarget;
9+
import com.im4j.kakacache.rxjava.core.disk.converter.SerializableDiskConverter;
10+
import com.im4j.kakacache.rxjava.core.disk.journal.LRUDiskJournal;
11+
import com.im4j.kakacache.rxjava.core.disk.storage.FileDiskStorage;
12+
import com.im4j.kakacache.rxjava.core.memory.journal.LRUMemoryJournal;
13+
import com.im4j.kakacache.rxjava.core.memory.storage.SimpleMemoryStorage;
14+
import com.im4j.kakacache.rxjava.manager.RxCacheManager;
15+
16+
import java.io.File;
17+
18+
import rx.Observable;
19+
20+
/**
21+
* RxJava的远程数据缓存处理
22+
* @version alafighting 2016-06
23+
*/
24+
public class RxRemoteCache {
25+
26+
private RxRemoteCache() {
27+
}
28+
29+
private static RxCacheManager cacheManager;
30+
private static int expires = 12 * 60 * 60 * 1000;
31+
32+
private static RxCacheManager getCacheManager() {
33+
if (cacheManager == null) {
34+
File storageDir = new File(Environment.getExternalStorageDirectory(), "aaa_test");
35+
Log.e("RxRemoteCache", "storageDir="+storageDir.getAbsolutePath());
36+
37+
storageDir.mkdirs();
38+
39+
CacheCore.Builder coreBuilder = new CacheCore.Builder();
40+
coreBuilder.memory(new SimpleMemoryStorage());
41+
coreBuilder.memoryJournal(new LRUMemoryJournal());
42+
coreBuilder.memoryMax(10 * 1024 * 1024, 1000);
43+
coreBuilder.disk(new FileDiskStorage(storageDir));
44+
coreBuilder.diskJournal(new LRUDiskJournal());
45+
coreBuilder.diskMax(30 * 1024 * 1024, 10 * 1000);
46+
coreBuilder.diskConverter(new SerializableDiskConverter());
47+
CacheCore core = coreBuilder.create();
48+
cacheManager = new RxCacheManager(core);
49+
}
50+
return cacheManager;
51+
}
52+
53+
public static <T> rx.Observable<T> load(String key) {
54+
return getCacheManager().load(key);
55+
}
56+
57+
public static <T> rx.Observable<Boolean> save(String key, T value, CacheTarget target) {
58+
return getCacheManager().save(key, value, expires, target);
59+
}
60+
61+
public static <T> rx.Observable<Boolean> save(String key, T value) {
62+
return save(key, value, CacheTarget.MemoryDisk);
63+
}
64+
65+
66+
67+
public static <T> Observable<CacheTransformer.CacheData<T>> cache(Observable<T> observable, String key) {
68+
return observable.compose(new CacheTransformer<>(key));
69+
}
70+
71+
}

0 commit comments

Comments
 (0)