GIF鎮(zhèn)樓
框架引入
在項目根目錄的build.gradle
文件中添加
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
app目錄下的build.gradle
文件中添加
dependencies {
implementation 'com.github.Martin0207.LazyBread:core:v1.0.2'
annotationProcessor 'com.github.Martin0207.LazyBread:processor:v1.0.2'
}
框架使用
public class TwoFragment extends Fragment {
private static final String TAG = TwoFragment.class.getSimpleName();
private TextView mTv;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
/*
手動監(jiān)聽Fragment的顯隱
*/
LazyBread.onUserVisibleHint(this, isVisibleToUser);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
綁定Fragment
需要在onActivityCreated或之前調(diào)用
*/
LazyBread.bind(this);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.normal_fragment, container, false);
mTv = inflate.findViewById(R.id.tv);
return inflate;
}
/**
* 注解方法,實現(xiàn)懶加載
*/
@LazyInit()
public void lazy() {
mTv.setText(TAG);
}
}
邏輯圖
框架優(yōu)勢
1.使用簡單
如上圖展示发笔,僅需要簡單的三步就可以實現(xiàn)Fragment的懶加載功能悉默,并且不破壞原有代碼脑又。
2.支持懶加載方法排序
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LazyInit {
/**
* 是否在每次Fragment對用戶可見時都調(diào)用
* 默認情況下期奔,F(xiàn)ragment只需要調(diào)用一次初始化方法
* @return 默認不重復
*/
boolean isCycle() default false;
/**
* 優(yōu)先值
* 同一個Fragment中澡谭,若擁有多個方法被注解抹锄,
* 則按照優(yōu)先值由大到小的順序調(diào)用
* @return 默認為1
*/
int priority() default 1;
}
如源碼中展示,可以根據(jù)priority
排列調(diào)用順序著瓶。
3.支持方法重復調(diào)用
代碼如上瞳秽,我們可以設置被LazyInit注解的方法是否在每次觸發(fā)時調(diào)用
4.支持Fragment多層嵌套
5.支持框架自動解綁
框架綁定有@LazyInit注解方法的Fragment時挠铲,會主動監(jiān)聽Fragment的生命周期,并且在onFragmentDestroyed
時解除Fragment的綁定寂诱。當然也你也可以手動解除綁定拂苹。
結(jié)語
框架功能主要由Annotation和AnnotationProcessor來實現(xiàn),實現(xiàn)方式與思路并不復雜痰洒,這里就不做源碼分析了瓢棒。如果有興趣,可以來看下源碼
上文沒有太多文字描述內(nèi)容丘喻,我主要還是喜歡在代碼備注中表示內(nèi)容脯宿,感覺更直接了當。