TouTiao开源项目 分析笔记7 加载数据的过程
1.以新聞頁中的段子數據顯示為例
1.1.首先執行InitApp==>SplashActivity。
因為在AndroidManifest.xml中定義了一個<intent-filter>中有定義啟動頁
?
1.2.然后SplashActivity==>MainActivity。
這是是intent的跳轉。
?
1.3.然后執行MainActivity中的onCreate==>執行里面的initView()
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initView()?
1.4.然后執行onCreate中的showFragment函數。
showFragment(savedInstanceState.getInt(POSITION))bottom_navigation!!.selectedItemId=savedInstanceState.getInt(SELECT_ITEM)?
1.5.然后進入NewsTabLayout中的getInstance函數
newsTabLayout = NewsTabLayout.getInstance()ft.add(R.id.container, newsTabLayout, NewsTabLayout::class.java.name)?
1.6.然后執行getInstance函數==>new NewsTabLayout()
public static NewsTabLayout getInstance(){if(instance==null){instance=new NewsTabLayout();}return instance;}?
1.7.然后執行NewsTabLayout中的onCreateView(它是一個Fragment)
View view = inflater.inflate(R.layout.fragment_news_tab, container, false);initView(view);initData();return view;?
1.8.按順序來==>initData()==>內部有一個initTabs()
for(NewsChannelBean bean:channelList){Fragment fragment=null;String channelId=bean.getChannelId();switch (channelId){case "essay_joke":if(map.containsKey(channelId)){fragmentList.add(map.get(channelId));}else{fragment= JokeContentView.newInstance();fragmentList.add(fragment);}break;這里就是加載了8個初始碎片。
?
1.9.然后執行NewsTabLayout中的initData()中的
adapter=new BasePagerAdapter(getChildFragmentManager(),fragmentList,titleList);viewPager.setAdapter(adapter);viewPager.setOffscreenPageLimit(15);?
1.10.進入RxBus==>注冊了NewsTabLayout.TAG
observable=RxBus.getInstance().register(NewsTabLayout.TAG);observable.subscribe(new Consumer<Boolean>() {@Overridepublic void accept(Boolean isRefresh) throws Exception {if(isRefresh){initTabs();adapter.recreateItems(fragmentList,titleList);}}});?
1.11.回到NewsTabLayout的onCreateView。返回view。
@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_news_tab, container, false);initView(view);initData();return view;}
?
1.12.然后執行Fragment的performCreateView()
?
1.13.然后執行RxAppCompatActivity==>onStart()
?
1.14.然后執行Activity==>convertToTranslucent()
?
1.15.執行半天后到NewsTabLayout的onResume()中
@Overridepublic void onResume() {super.onResume();linearLayout.setBackgroundColor(SettingUtil.getInstance().getColor());}2.進入JokeContentView
2.1.首先監聽到的是setPresenter
@Overridepublic void setPresenter(IJokeContent.Presenter presenter) {if (null == presenter) {this.presenter = new JokeContentPresenter(this);}}?
2.2. 執行GroupBean==>自定義的一個Bean類非常龐大。
private List<JokeContentBean.DataBean.GroupBean> groupList=new ArrayList<>();?
2.3.執行BaseFragment中的setPresenter函數
@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setPresenter(presenter);}?
2.4.然后進入LazyLoadFragment的onCreate()
@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}?
2.5.然后多次在JokeContentPresenter的構造函數中循環
?
2.6.然后進入BaseFragment的onCreateView中
@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {View view = inflater.inflate(attachLayoutId(), container, false);initView(view);initData();return view;}
?
2.7.然后執行BaseListFragment的attachLayoutId函數。
@Overrideprotected int attachLayoutId() {return R.layout.fragment_list;}?
2.8.然后執行到JokeContentView的initView中
@Overrideprotected void initView(View view) {super.initView(view);adapter = new MultiTypeAdapter(oldItems);Register.registerJokeContentItem(adapter);recyclerView.setAdapter(adapter);recyclerView.addOnScrollListener(new OnLoadMoreListener() {@Overridepublic void onLoadMore() {if (canLoadMore) {canLoadMore = false;presenter.doLoadMoreData();}}});}?
2.9.然后執行到Register中的registerJokeContentItem函數
public static void registerJokeContentItem(@NonNull MultiTypeAdapter adapter) {adapter.register(JokeContentBean.DataBean.GroupBean.class, new JokeContentViewBinder());adapter.register(LoadingBean.class, new LoadingViewBinder());adapter.register(LoadingEndBean.class, new LoadingEndViewBinder());}?
2.10.然后執行JokeContentViewBinder
?
2.11.然后回到JokeContentView的initView
recyclerView.setAdapter(adapter);recyclerView.addOnScrollListener(new OnLoadMoreListener() {@Overridepublic void onLoadMore() {if (canLoadMore) {canLoadMore = false;presenter.doLoadMoreData();}}});?
2.12.然后回到BaseFragment中的onCreateView函數
@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(attachLayoutId(), container, false);initView(view);initData(); //=====執行到這里了return view;}?
2.13.然后進入JokeContentView中的initData()
@Overrideprotected void initData() {}?
2.14.然后回到LazyLoadFragment中,執行onActivityCreate
@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);isViewInitiated = true;prepareFetchData();}?
2.15.執行prepareFetchData()
public boolean prepareFetchData() {return prepareFetchData(false);}public boolean prepareFetchData(boolean forceUpdate) {if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {fetchData();isDataInitiated = true;return true;}return false;}?
3.回到BaseFragment的onCreateView
3.1.回到BaseFragment的onCreateView
@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {View view = inflater.inflate(attachLayoutId(), container, false);initView(view);initData();return view;}
?
3.2.進入BaseListFragment中的attachLayoutId
@Overrideprotected int attachLayoutId() {return R.layout.fragment_list;}?
3.3.進入JokeContentView中的initView函數
@Overrideprotected void initView(View view) {super.initView(view);adapter = new MultiTypeAdapter(oldItems);Register.registerJokeContentItem(adapter);recyclerView.setAdapter(adapter);recyclerView.addOnScrollListener(new OnLoadMoreListener() {@Overridepublic void onLoadMore() {if (canLoadMore) {canLoadMore = false;presenter.doLoadMoreData();}}});}?
3.4.再次進入Register
public class Register {public static void registerJokeContentItem(@NonNull MultiTypeAdapter adapter) {adapter.register(JokeContentBean.DataBean.GroupBean.class, new JokeContentViewBinder());adapter.register(LoadingBean.class, new LoadingViewBinder());adapter.register(LoadingEndBean.class, new LoadingEndViewBinder());} }?
3.5.回到BaseFragment的onCreateView函數
執行initData。
進入JokeContentView
@Overrideprotected void initData() {}?
3.6.再次進入LazyLoadFragment的onActivityCreated
@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);isViewInitiated = true;prepareFetchData();}?
3.7.回到BaseFragment的onCreateView
@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {View view = inflater.inflate(attachLayoutId(), container, false);initView(view);initData();return view;}
?
3.8.進入BaseListFragment的attachLayoutId
@Overrideprotected int attachLayoutId() {return R.layout.fragment_list;}
4.總結一下
4.1.首先加載底部導航欄的4個大碎片
NewsTabLayout/PhotoTabLayout/VideoTabLayout/MediaChannelVideo
?
4.2.加載NewsTabLayout詳細的布局==>fragment_news_tab。
? 然后確定8個默認的fragment(全部都是news_tab中的)
?
4.3.NewsTabLayout在onCreateView中的initData初始化數據的時候,用上了RxBus+Observable
?
4.4.執行LazyLoadFragment的setUserVisibleHint的不可見。
?
4.5.繼承關系的執行順序為:
父類靜態代碼區和父類靜態成員 子類靜態代碼區和子類靜態成員 父類非靜態代碼區和普通成員 父類構造函數 子類非靜態代碼區和普通成員 子類構造函數?
4.6.BaseFragment應該算是比較祖先級別的。所以先執行這個函數的onCreate==>onCreateView
在BaseFragment中已經有了一個泛型的 presenter了。
?
4.7.在子類中JokeContentView中有一個設置presenter的方法。設置成JokeContentPresenter。
JokeContentPresenter實現了IJokeContent.Presenter接口。
IJokeContent主要有兩個內部接口View+Presenter。
?
4.8.在JokeContentPresenter中進行API請求,主要函數為doLoadData()。
采用了一個RetrofitFactory緩存機制。
4.9.然后回到子類,也就是祖先的后代繼承者。BaseListFragment
?
4.10.然后到LazyLoadFragment中的onActivityCreate中執行 準備取數據的操作。prepareFetchData()。
?
4.11.然后回到子類JokeContentView來加載數據了。onLoadData()
首先執行BaseListFragment復寫的onShowLoading函數。
然后執行子類JokeContentPresenter來doLoadData()來請求數據。(調用方式為:presenter.doLoadData())
這里進行了Cookie持久化操作。
?
4.12.然后回到懶加載LazyLoadFragment中,成功執行了prepareFetchData,設置初始化為true。
?
4.13.然后到祖先BaseFragment中的onCreateView函數中,加載fragment_list布局。
執行祖先的initView==>成功轉到JokeContentView的initView(Register注冊了數據+recylerView監聽滑動)
然后轉到BaseListFragment的initView(設置SwipeRefreshLayout的刷新事件)
然后轉到RetrofitFactory添加緩存
然后轉到JokeContentView的initView(繼續Register+recyclerView監聽滑動)
這個Register里面關聯了一個JokeContentViewBinder綁定,比較復雜。
然后轉到JokeContentPresenter的doLoadData來請求API
然后到懶加載LazyLoadFragment的onActivityCreated中==>prepareFetchData()準備取數據
然后回到祖先的onCreateView中加載fragment_list布局
繼續循環....
轉載于:https://www.cnblogs.com/Jason-Jan/p/7992838.html
總結
以上是生活随笔為你收集整理的TouTiao开源项目 分析笔记7 加载数据的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php self this parent
- 下一篇: [CentOS7] systemd