如果在學習 LiveData ,其中需要ViewModelProviders,會出現爆紅,找不到該類的方法,那是沒有導入相關庫,如下:
implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0"
implementation 'android.arch.lifecycle:extensions:1.1.1'
首先 ViewModelProviders 裏有兩個靜態 私有方法,一個checkAppliaction ,另一個 是checkActivity :
private static Application checkApplication(Activity activity)
{
Application applictaion = activity.getApplication();
if(application==null)
{
throw new IllegalStateExceptio("Your activity/fragment is not yet attached to "+ "Application. You can't request ViewModel before onCreate call.");
}
return application;
}
檢查是activity 或者 fragment 是否依附在Application 上,並返回application 實例,否則拋出錯誤
private static Activity checkActivity (Fragment fragment){
Activity activity = fragment. getActivity();
if(activity==null)
{
throw new("Can't create ViewModelProvider for detached fragment");
}
return activity;
}
checkActivity 該方法是檢查 fragment 是否綁定在activity ,如果沒有,則拋出錯誤,返回activity。
of方法
ViewModelProviders 類中,of 使用重載,分別是:
of(@NonNull Fragment fragment)
@NonNull
@MainThread
public static ViewModelProvider of (@NonNull Fragment fragment)
{
return of(fragment,null)
}
該方法指向 of(@NonNull Fragment fragment, @Nullable Factory factory) ,得到 ViewModelProvider 實例
tips:
@NonNull 修飾的參數或者程序時,開發IDE工具會警告程序可能會有崩潰的風險,這是靜態分析方法,運行時不會有任何警告
@MainThread:表示標記的方法只應在主線程調用。如果標記的是一個類,那麼該類中的所有方法都應該是在主線程被調用。例:(通常,應用程序的主線程也是 Ui 線程。但是,在特殊情況下,應用程序的主線程可能不是其 Ui 線程)
of(@NonNull FragmentActivity activity)
@NonNull
@MainThread
public static ViewModelProvider of (@NonNull FragmentActivity activity)
{
return of(activity,null)
}
傳入的參數 FragmentActivity 和 Factory , 其中 Factory可以爲null,一般都爲null,並且指向of(@NonNull FragmentActivity activity,@Nullable Factory factory)
of(@NonNull Fragment fragment, @Nullable Factory factory)
@NonNull
@MainThread
public static ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory) {
Application application = checkApplication(checkActivity(fragment));
if (factory == null) {
factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
}
return new ViewModelProvider(fragment.getViewModelStore(), factory);
}
該方法傳入 fragment 和 null 參數,首先檢查 fragment 是否綁定在activity 和是否依附在Application 並返回application,接着 根據 factory 參數 的null 值 ,實例化ViewMoels,返回 實例化ViewModelProvider
of(@NonNull FragmentActivity activity,@Nullable Factory factory)
@NonNull
@MainThread
public static ViewModelProvider of(@NonNull FragmentActivity activity,@Nullable Factory factory) {
Application application = checkApplication(activity);
if (factory == null) {
factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
}
return new ViewModelProvider(activity.getViewModelStore(), factory);
}
該方法傳入 activity 和 null 參數,首先檢查 activity是否依附在Application,接着 根據 factory 參數 的null 值 ,實例化ViewMoels,返回 實例化ViewModelProvider。
tips:fragmentactivity 繼承自activity,用來解決android3.0 之前沒有fragment的api,所以在使用的時候需要導入support包,同時繼承fragmentActivity,這樣在activity中就能嵌入fragment來實現你想要的佈局效果。
@Deprecated
public static class DefaultFactory extends ViewModelProvider.AndroidViewModelFactory {
/**
* Creates a {@code AndroidViewModelFactory}
*
* @param application an application to pass in {@link AndroidViewModel}
* @deprecated Use {@link ViewModelProvider.AndroidViewModelFactory} or
* {@link ViewModelProvider.AndroidViewModelFactory#getInstance(Application)}.
*/
@Deprecated
public DefaultFactory(@NonNull Application application) {
super(application);
}
}
該方法被@Deprecated,是可能之前有用過,現在不需要了, 在Java中凡是使用@Deprecated標誌的類,都是不鼓勵使用的類,如果使用或者進行重寫,程序會發出警告。