日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TouTiao开源项目 分析笔记7 加载数据的过程

發布時間:2025/6/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 加载数据的过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。