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 Jenly */ @Singleton public class DataRepository implements IDataRepository { @Inject Lazy mRetrofit; @Inject Application mApplication; @Inject AppliesOptions.RoomDatabaseOptions mRoomDatabaseOptions; /** * 缓存 Retrofit Service */ private LruCache mRetrofitServiceCache; /** * 缓存 RoomDatabase */ private LruCache mRoomDatabaseCache; @Inject public DataRepository(){ } /** * 提供上下文{@link Context} * @return {@link #mApplication} */ @Override public Context getContext() { return mApplication; } /** * 传入Class 通过{@link Retrofit#create(Class)} 获得对应的Class * @param service * @param * @return {@link Retrofit#create(Class)} */ @Override public T getRetrofitService(@NonNull Class 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#build()}获得对应的Class * @param database * @param dbName 为{@code null}时,默认为{@link Constants#DEFAULT_DATABASE_NAME} * @param * @return {@link RoomDatabase.Builder#build()} */ @Override public T getRoomDatabase(@NonNull Class 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 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; } }