平時都會在印象筆記寫日報和週報,現在嘗試寫一寫月報,總結1月份的收穫與體會,具體的內容:
自我學習: 本月在工作之餘,學習了什麼知識
遇到的問題: 本月在工作中遇到的技術問題及解決方法
收穫體會: 本月在工作學習過程中,有哪些收穫或者感悟體會,有哪些優秀點,繼續堅持。
待改進的地方: 本月工作學習過程中,有哪些地方做的不好,以後需要改進。
自我學習
學習清單
- 1、極客時間的Java
- 2、劍指offer
- 3、整理一篇博客(HashMap的解析)
- 4、總結一篇博客(VideoView的內存泄漏問題)
- 5、RN學習
5、RN學習
RN 集成到現有原生應用
https://reactnative.cn/docs/integration-with-existing-apps/
運行命令
在RN根目錄下執行 >react-native run-android
注意RN版本問題,可以從packaget.json看到
如果是低版本(如低於0.49 ),有個問題:(沒有這個方法setJSMainModulePath,改成這個setJSMainModuleName)(也沒有index.js,而是index.android.js)
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
iOS 和 Android 開發的 React Native 入門指南
https://danleechina.github.io/A-Guide-of-React-Native-for-iOS-And-Android-developer/
- 建議在原生項目上添加 RN 支持,文檔地址集成到現有原生應用。
如果使用 create-react-native-app AwesomeProject 命令來生成一個 RN 項目,會引入 Expo 這種東西,我個人不建議使用此類框架。 - 不建議使用 NavigatorIOS 這類組件,推薦 React Navigation,但是這個開源組件坑也比較多,不過個人認爲還是比 RN 提供的組件要好。
一些參考:
(1)RN集成原生Android開發 https://www.jianshu.com/p/2fbdf5a12922
(2)【React Native】環境搭建的error
calling AppRegistery.runApplication
解決辦法
[https://blog.csdn.net/colinandroid/article/details/71539168
http://localhost:8081/index.android.bundle?platform=android](https://blog.csdn.net/colinandroid/article/details/71539168
http://localhost:8081/index.android.bundle?platform=android)
可以驗證自己的packager是否是可以用的
React Native的WebStorm基本設置
https://blog.csdn.net/xiangzhihong8/article/details/52293896
在webstorm熱加載:在手機搖一搖出設置彈窗,選擇Live Reload(全局刷新,寫完代碼保存一下就會自動更新)
遇到的問題
1、某個手機的TextView不可點擊,其他手機可以
解決方法:首先確定點擊屬性是有的(AS>Tools>LayoutInspector),嘗試各個方法(implement View.onClickListener / xmlz中onclick / kotilin代碼轉java) 均無效
最後,把TextView的位置上移,發現可以點擊了(進而把TextView換成Button,也可以點擊) ,猜測是手機觸摸區域問題
2、Uri.fromFile(file)在Android8.0手機報崩潰
解決方法:關於Android 7.0 適配中 FileProvider 部分的總結
http://yifeng.studio/2017/05/03/android-7-0-compat-fileprovider/
另外解決微信不能分享問題
https://www.jianshu.com/p/a950f5596a01
用系統提供的URI方式
content://media/external/video/media/44224
而不用自定義fileprovider方式
content://{applicationId}.provider/external_files/video/xxx.mp4
private fun getVideoContentUri(context: Context, videoFile: File): Uri? {
val filePath = videoFile.absolutePath
val cursor = context.contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
arrayOf(MediaStore.Video.Media._ID), MediaStore.Video.Media.DATA + "=? ",
arrayOf(filePath), null)
var uri: Uri? = null
if (cursor != null) {
if (cursor.moveToFirst()) {
val id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID))
val baseUri = Uri.parse("content://media/external/video/media")
uri = Uri.withAppendedPath(baseUri, "" + id)
}
cursor.close()
}
if (uri == null) {
val values = ContentValues()
values.put(MediaStore.Video.Media.DATA, filePath)
uri = context.contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values)
}
return uri
}
3、崩潰問題
解決方法:這個是kotlin的安全檢查問題,修改判null即可
反思:這個問題解決比較慢,50分鐘左右,其實20分鐘應該就足夠了
爲什麼解決這麼慢?沒有仔細看崩潰日誌,被混淆的日誌干擾
爲什麼會混淆的日誌干擾?對混淆日誌的反編譯,比較麻煩,有抵觸心理
爲什麼不找簡單的方法,有沒有不麻煩的方法?有的,比如下面這個日誌,分析下,應該是ui.browser包下,a類下的onActivityResult方法,這個可以onActivityResult出發
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method com.xxx.xxx.ui.browser.a.onActivityResult
用搜索,然後找ui.browser包下
4、發出三個通知,不同的Pending,但只有點擊第1個通知有效,其他兩個無效
解決方法:這種問題是因爲pending的跳轉對象是一樣的,然後設置的requestCode也是一樣導致的,修改成不同的requestCode即可
5、icepick恢復數據無效
原因:不支持kotlin
https://github.com/frankiesardo/icepick/issues/47
解決方法:現在直接用onSaveInstanceState保存數據,在onCreated恢復數據
另外可用開源庫(支持kotlin)
https://github.com/evernote/android-state
6、在Android 8.0上的禁止通知聲音有問題
解決方法:
在Android8.0以下的系統:不設置NotificationCompat.Builder.setSound(或者setSound(null))可以禁止通知聲音
這種方法在Android8.0及以上無效,需要用NotificationChannel的方式,設置importance參數爲NotificationManager.IMPORTANCE_LOW
NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_LOW)
這時候才能禁止Android8.0及以上系統通知的聲音
收穫體會
1、整理詳細業務的感悟
前期在寫日報的時候,太過於簡單,只是一句話(還是描述性語句),沒有寫到詳細的過程,比如debug Android源碼,沒有寫到debug的最關鍵代碼,最終得出什麼結論。
還是要認真對待自己的工作,日報是一個很好的表現,不要偷懶。
2、幫同事解決問題,幫他梳理解決驗證方案,並傳授經驗,解決問題的三步驟:分析問題、列舉方案、逐一驗證
3、在對需求時候通過畫邏輯流程圖,幫助梳理保活邏輯
webview的客戶端調用js
方法1:loadUrl()
方法2:evaluateJavascript() 異步,有回調方法
js調用客戶端Java:
注入映射方法:addJavascriptInterface() (將 Java 對象和 JS 對象進行映射)
5、requestLayout() and invalidate()的區別
invalidate()只是執行了onDraw方法,而requestLayout方法執行onMeasure、onLayout、onDraw方法
https://stackoverflow.com/questions/13856180/usage-of-forcelayout-requestlayout-and-invalidate
待改進的地方
再接再厲