doum
6 天以前 2b287056e2f59518888d05a1bbc7e5a55fbd84d5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package com.doumee.lib_coremodel.data;
 
import android.app.Application;
import android.content.Context;
import android.text.TextUtils;
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.collection.LruCache;
import androidx.room.Room;
import androidx.room.RoomDatabase;
 
import com.doumee.lib_coremodel.config.AppliesOptions;
import com.doumee.lib_coremodel.config.Constants;
import com.doumee.lib_coremodel.util.Preconditions;
 
import javax.inject.Inject;
import javax.inject.Singleton;
 
import dagger.Lazy;
import retrofit2.Retrofit;
 
/**
 * 统一管理数据业务层
 * @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
 */
@Singleton
public class DataRepository implements IDataRepository {
 
    @Inject
    Lazy<Retrofit> mRetrofit;
 
    @Inject
    Application mApplication;
 
    @Inject
    AppliesOptions.RoomDatabaseOptions mRoomDatabaseOptions;
 
    /**
     * 缓存 Retrofit Service
     */
    private LruCache<String, Object> mRetrofitServiceCache;
    /**
     * 缓存 RoomDatabase
     */
    private LruCache<String, Object> mRoomDatabaseCache;
 
    @Inject
    public DataRepository(){
    }
 
    /**
     * 提供上下文{@link Context}
     * @return {@link #mApplication}
     */
    @Override
    public Context getContext() {
        return mApplication;
    }
 
    /**
     * 传入Class 通过{@link Retrofit#create(Class)} 获得对应的Class
     * @param service
     * @param <T>
     * @return {@link Retrofit#create(Class)}
     */
    @Override
    public <T> T getRetrofitService(@NonNull Class<T> service) {
        if(mRetrofitServiceCache == null){
            mRetrofitServiceCache = new LruCache<>(Constants.DEFAULT_RETROFIT_SERVICE_MAX_SIZE);
        }
        Preconditions.checkNotNull(mRetrofitServiceCache);
 
        T retrofitService = (T)mRetrofitServiceCache.get(service.getCanonicalName());
        if(retrofitService == null){
            synchronized (mRetrofitServiceCache) {
                if(retrofitService == null){
                    retrofitService = mRetrofit.get().create(service);
                    //缓存
                    mRetrofitServiceCache.put(service.getCanonicalName(),retrofitService);
                }
 
            }
        }
 
        return retrofitService;
    }
 
    /**
     * 传入Class 通过{@link Room#databaseBuilder},{@link RoomDatabase.Builder<T>#build()}获得对应的Class
     * @param database
     * @param dbName 为{@code null}时,默认为{@link Constants#DEFAULT_DATABASE_NAME}
     * @param <T>
     * @return {@link RoomDatabase.Builder<T>#build()}
     */
    @Override
    public <T extends RoomDatabase> T getRoomDatabase(@NonNull Class<T> database, @Nullable String dbName) {
        if(mRoomDatabaseCache == null){
            mRoomDatabaseCache = new LruCache<>(Constants.DEFAULT_ROOM_DATABASE_MAX_SIZE);
        }
        Preconditions.checkNotNull(mRoomDatabaseCache);
 
        T roomDatabase = (T)mRoomDatabaseCache.get(database.getCanonicalName());
        if(roomDatabase == null) {
            synchronized (mRoomDatabaseCache) {
                if (roomDatabase == null) {
                    RoomDatabase.Builder<T> builder = Room.databaseBuilder(getContext().getApplicationContext(), database, TextUtils.isEmpty(dbName) ? Constants.DEFAULT_DATABASE_NAME : dbName);
                    if(mRoomDatabaseOptions != null){
                        mRoomDatabaseOptions.applyOptions(builder);
                    }
                    roomDatabase = builder.build();
                    //缓存
                    mRoomDatabaseCache.put(database.getCanonicalName(), roomDatabase);
                }
            }
        }
        return roomDatabase;
    }
 
}