Skip to content

Instantly share code, notes, and snippets.

@jmatsu
Created May 22, 2017 05:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jmatsu/4e1bb596c79df32eec962c5b65ab1918 to your computer and use it in GitHub Desktop.
Save jmatsu/4e1bb596c79df32eec962c5b65ab1918 to your computer and use it in GitHub Desktop.
class MyDefaultFactory extends ViewModelProviders.DefaultFactory {
// constructor
private final Map<String, ViewModel> mMap = new HashMap<>();
@Nullable
private String onetimeCacheKey;
@MainThread
public void setKey(@NonNull String key) {
this.onetimeCacheKey = key;
}
@MainThread
public void clear(@NonNull String key) {
mMap.remove(key);
}
@Override public <T extends ViewModel> T create(Class<T> modelClass) {
if (onetimeCacheKey != null) {
T viewModel = null;
if (mMap.containsKey(onetimeCacheKey)) {
ViewModel tmp = mMap.get(onetimeCacheKey);
if (modelClass.isInstance(tmp)) {
viewModel = (T) mMap.get(onetimeCacheKey);
}
}
if (viewModel == null) {
viewModel = super.create(modelClass);
mMap.put(onetimeCacheKey, viewModel);
}
onetimeCacheKey = null;
return viewModel;
} else {
return super.create(modelClass);
}
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
return super.create(modelClass);
}
}
class MyViewModelProvider extends ViewModelProvider {
private final Factory mFactory;
// two constructors
@NonNull @Override public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
if (mFactory instanceof MyDefaultFactory)
((MyDefaultFactory) mFactory).setKey(key);
return super.get(key, modelClass);
}
}
public class MyViewModelProviders extends ViewModelProviders {
@SuppressLint("StaticFieldLeak")
private static MyDefaultFactory sMyDefaultFactory;
private static void initializeFactoryIfNeeded(Application application) {
if (sMyDefaultFactory == null) {
sMyDefaultFactory = new MyDefaultFactory(application);
}
}
@MainThread
public static ViewModelProvider of(@NonNull FragmentActivity activity) {
initializeFactoryIfNeeded(activity.getApplication());
return new ViewModelProvider(ViewModelStores.of(activity), sMyDefaultFactory);
}
@MainThread
public static ViewModelProvider of(@NonNull Fragment fragment) {
FragmentActivity activity = fragment.getActivity();
if (activity == null) {
throw new IllegalArgumentException(
"Can't create ViewModelProvider for detached fragment");
}
initializeFactoryIfNeeded(activity.getApplication());
return new ViewModelProvider(ViewModelStores.of(fragment), sMyDefaultFactory);
}
@MainThread
public static void clear(@NonNull String key) {
sMyDefaultFactory.clear(key);
}
}
class Sample1Activity extends FragmentActivity {
void onCreate(Bundle bundle) {
// call super
MyViewModel viewmodel1 = MyViewModelProviders.of(this).get("some", MyViewModel.class);
}
}
class Sample2Activity extends FragmentActivity {
void onCreate(Bundle bundle) {
// call super
MyViewModel viewmodel2 = MyViewModelProviders.of(this).get("some", MyViewModel.class);
}
}
// maybe assert(viewModel1 == viewModel2) #=> true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment