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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

9于word没有注册类_XPage系列这次升级后终于是全自动化注册了!

發布時間:2024/10/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 9于word没有注册类_XPage系列这次升级后终于是全自动化注册了! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方藍字關注我們

前言

作為 X-Library系列框架 的靈魂所在,XPage 開源兩年以來,一直致力于降低Fragment使用的難度,努力實現一個Activity多Fragment的Android開發模式。

就在前不久,我就整理了XPage開源這幾年來的使用情況,寫了一篇《史上最方便的Android頁面框架XPage使用指南》 ,并且還錄了幾期視頻單獨講解了XPage的使用 ,讓越來越多地人看到了XPage使用的便捷性。

但就在前幾天,在交流群里突然有人問我下面幾個問題:

  • 1.我如果想在多個module中使用XPage,我該怎么辦呀?
  • 2.為什么我使用XPage之后,一直找不到AppPageConfig這個類啊?

上面的問題讓我突然認識到一點:并不是所有人都對APT技術有所了解的。

看來我之前參考ARouter實現的自動注冊功能可能并沒有完善,難怪ARouter后來會寫一個arouter-register插件來實現自動注冊的功能。

于是乎,為了能夠讓XPage的自動注冊功能更加完美,我加班加點開發,于是就有了XPage的3.1.1版本--徹底的自動化注冊 。

升級后有什么變化

在感受全自動化頁面注冊帶來的便利之前,讓我們先來感受一下之前版本的使用。

3.1.1之前版本

在3.1.1之前版本,在使用自動注冊功能的時候,還是需要實現PageConfiguration接口,并調用編譯時自動生成的頁面配置類“moduleName”+PageConfig 的getPages()方法返回注冊的頁面。

PageConfig.getInstance()
????????.setPageConfiguration(new?PageConfiguration()?{?//頁面注冊
????????????@Override
????????????public?List?registerPages(Context?context)?{
????????????????//自動注冊頁面,是編譯時自動生成的,build一下就出來了。如果你還沒使用@Page的話,暫時是不會生成的。return?AppPageConfig.getInstance().getPages();?//自動注冊頁面
????????????}
????????})
????????.debug("PageLog")???????//開啟調試
????????.setContainActivityClazz(XPageActivity.class)?//設置默認的容器Activity
????????.enableWatcher(false)???//設置是否開啟內存泄露監測
????????.init(this);?

可以看到,這里的自動注冊還是需要一部分手動配合才能完成的。如果說你當前只有一個module的話,可能還好說。但是如果你使用了多個module之后,你就需要把多個module生成的配置類像上面那樣一個一個地加進去,這樣用起來會讓人感覺非常的不方便,這明顯違背了我寫XPage框架的初衷!

不僅如此,這樣寫死還會帶來其他很多問題:

  • 1.如果module名變了,還需要對應地去修改配置類的類名。
  • 2.如果當前module沒有使用@Page注解修飾Fragment的話,配置類也不會自動生成,這樣會讓很多初次使用者非常疑惑。
  • 3.項目要是沒有編譯過的話,配置類是不會自動生成的,這樣代碼就會報錯說類找不到,然后很多新手就懵逼了。

3.1.1之后版本

為了能夠解決以上的問題,我實現了一個自動注冊的配置類AutoPageConfiguration 。那么下面就看一下最新版本的XPage是如何注冊的吧:

PageConfig.getInstance()
????????.debug("PageLog")???????//開啟調試
????????.setContainActivityClazz(XPageActivity.class)?//設置默認的容器Activity,按需設置(非必須)
????????.init(this);????????????//初始化頁面配置

是的,你沒有看錯,這里沒有手動實現PageConfiguration接口的部分了,可以說是真正實現了全自動頁面注冊,是不是非常方便呀?

如何實現注冊的自動化

看到上面的變化,你是不是非常想知道我是如何實現徹底的自動化注冊的?

想要回答這個問題,還是讓我們先看一看這個編譯時自動生成的配置類是如何實現的。

APT技術實現頁面配置類的自動生成

其實當初實現頁面配置類的自動生成的方案,也是我研讀了ARouter源碼之后,受到了APT技術的啟發后完成的。

因為XPage實現路由跳轉主要就是靠 PageInfo 和 Fragment 建立起來的映射關系。當時的思路就是采用APT技術,利用@Page注解去標識需要注冊的Fragment,然后在編譯的時候通過APT技術去掃描出所有使用了@Page注解標識了的Fragment,將注解信息轉化為PageInfo, 并按module生成對應的頁面配置類,在這個配置類里面存放了該module下所有標注了@Page的頁面信息PageInfo。

下面是自動生成的一個簡單的配置類例子:

可以看到,自動生成的配置類都會存放在com.xuexiang.xpage.config包下,類名都是以PageConfig作為結尾。注意這里非常關鍵,它是我后面實現自動化注冊的關鍵。

詳細的實現細節,可以參見XPage的頁面配置自動生成器PageConfigProcessor的源碼 。

運行時掃描指定包下的配置類反射實現自動注冊

上面我們在了解頁面配置類是如何自動生成的時候發現一個規律:

自動生成的配置類都會存放在com.xuexiang.xpage.config包下,類名都是以PageConfig作為結尾。

那么我們可不可以在運行的時候,直接掃描com.xuexiang.xpage.config包下的所有類,然后找到以PageConfig作為結尾的配置類,然后反射它的getPages方法直接獲取到所有的配置信息,然后注冊進去?

下面是我根據上面的猜想,實現的AutoPageConfiguration類源碼:

public?class?AutoPageConfiguration?implements?PageConfiguration?{
????/**
?????*?頁面配置所在的包名
?????*/
????private?static?final?String?PAGE_CONFIG_PACKAGE_NAME?=?"com.xuexiang.xpage.config";
????/**
?????*?頁面配置生成類的類后綴名
?????*/
????private?static?final?String?PAGE_CONFIG_CLASS_NAME_SUFFIX?=?"PageConfig";

????@Override
????public?List?registerPages(Context?context)?{
????????List?pageInfos?=?new?ArrayList<>();
????????Set?classSet?=?null;
????????try?{
????????????classSet?=?ClassUtils.getClassNames(context,?PAGE_CONFIG_PACKAGE_NAME);
????????}?catch?(Exception?e)?{
????????????e.printStackTrace();
????????}if?(classSet?!=?null)?{for?(String?className?:?classSet)?{if?(className?!=?null?&&?className.endsWith(PAGE_CONFIG_CLASS_NAME_SUFFIX))?{
????????????????????try?{
????????????????????????pageInfos.addAll(getPagesByClass(Class.forName(className)));
????????????????????}?catch?(Exception?e)?{
????????????????????????PageLog.e(e);
????????????????????}
????????????????}
????????????}
????????}return?pageInfos;
????}
????private?List?getPagesByClass(Class>?clazz)?throws?Exception?{
????????//?獲取單例對象
????????Method?getInstanceMethod?=?clazz.getDeclaredMethod("getInstance");
????????getInstanceMethod.setAccessible(true);
????????Object?instance?=?getInstanceMethod.invoke(null);
????????//?獲取頁面信息
????????Method?getPagesMethod?=?clazz.getDeclaredMethod("getPages");
????????getPagesMethod.setAccessible(true);return?(List)?getPagesMethod.invoke(instance);
????}
}

從源碼中我們可以看到,我是這樣做的:

  • 1.使用ClassUtils.getClassNames獲取到com.xuexiang.xpage.config包下的所有類的類名。這里的ClassUtils也是我借鑒了ARouter里面的源碼。
  • 2.遍歷這個類名集合,并根據類名結尾是否是PageConfig篩選出所有的配置類。
  • 3.調用getPagesByClass方法,反射獲取到配置類的所有頁面信息,然后加入到頁面集合中,最終返回所有module配置頁面的信息。

有了AutoPageConfiguration之后,下面就非常簡單啦,我們只需要將mPageConfiguration默認設置成AutoPageConfiguration,這樣就可以實現自動化注冊啦!

/**
?*?初始化頁面信息
?*
?*?@param?context?上下文
?*/
private?void?initPages(Context?context)?{
????if?(mPageConfiguration?==?null)?{
????????//?沒有設置的話,就使用自動注冊配置
????????mPageConfiguration?=?new?AutoPageConfiguration();
????}
????registerPageInfos(mPageConfiguration.registerPages(context));
????CoreConfig.init(context,?getPages());
}

增加混淆配置

你以為到這兒就結束了?沒那么簡單!可以發現,上面的實現方案主要是依賴于掃描類并進行反射注冊的。所以如果代碼做了混淆了之后,該方案就會失效了,所以我們還需要在混淆配置清單中增加如下的配置來避免混淆:

-keep?class?com.xuexiang.xpage.config.**?{?*;?}

我們要保證com.xuexiang.xpage.config包下的類不能被混淆。

到這兒,自動注冊的實現算是真正的講完了,下面讓我們來瞧瞧XPage的新版本還有那些地方更新了!

其他更新

去除LeakCanary依賴

在此之前,XPage一直依賴了LeakCanary,主要原因還是LeakCanary在2.0版本之前的使用還是相當不方便的,于是我就做了一下默認集成以方便使用。

但是當LeakCanary升級到2.0以上版本的時候,這個問題似乎就沒了。因為進行了重新的設計,LeakCanary的使用變得沒那么具有侵入性,因此我就考慮去除了LeakCanary的依賴。

優化了頁面點擊的鍵盤處理

之前在XPageActivity里面做了簡單的頁面點擊處理:當用戶點擊到非輸入框區域就隱藏鍵盤。

但是這樣做了之后發現效果并不是很好,因為有些頁面可能并不需要這個功能,如果把這個寫到Activity里面的話,那么在這個Activity下的所有Fragment都將擁有這個功能,這樣非常不靈活。

除此之外,使用者可能也想自定義屏幕的觸摸事件,因此我對此做了重新設計,將觸摸事件的處理下放至每個Fragment之中,由Activity調用指定的方法進行處理。

相關鏈接

  • 史上最方便的Android頁面框架XPage使用指南
  • Navigation和XPage框架相比誰更香
  • XPage項目地址:https://github.com/xuexiangjys/XPage

最后

非常感謝大家對XPage 的支持,喜歡的小伙伴可以到項目的Github主頁:https://github.com/xuexiangjys/XPage 點擊star支持一下哦!

更多資訊內容,歡迎微信搜索公眾號:「我的Android開源之旅」

往期推薦

程序員的bug修復寶典

史上最全的開源項目創作指南

史上最優美的Android原生UI框架XUI使用指南

史上最好用的Android全量版本更新庫XUpdate使用指南

XPage頁面框架使用詳解

Navigation和XPage相比,到底誰更香?

點擊下方“閱讀原文”查看更多

多一個點在看

多一條小魚干

總結

以上是生活随笔為你收集整理的9于word没有注册类_XPage系列这次升级后终于是全自动化注册了!的全部內容,希望文章能夠幫你解決所遇到的問題。

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