12月收穫與體會

平時都會在印象筆記寫日報和週報,現在嘗試寫一寫月報,總結12月份的收穫與體會,具體的內容:

自我學習: 本月在工作之餘,學習了什麼知識

遇到的問題: 本月在工作中遇到的技術問題及解決方法

收穫體會: 本月在工作學習過程中,有哪些收穫或者感悟體會,有哪些優秀點,繼續堅持。

待改進的地方: 本月工作學習過程中,有哪些地方做的不好,以後需要改進。

自我學習

學習清單

  • 1、極客時間的Android開發高手課
  • 2、SVG的使用
  • 3、瞭解HTTP緩存和斷點續傳的標誌
  • 4、Java併發-可重入鎖
  • 5、防抖處理
  • 6、一些APP框架佈局

1、極客時間的Android開發高手課

目前是跟着每個課學習,然後在印象筆記記錄筆記。

講的內容的技術比較深,有些不是很懂,先接受爲主,後續有時間在再反覆深挖。

2、SVG的使用

輸出一篇博客: 矢量圖SVG的使用

3、瞭解HTTP緩存和斷點續傳的標誌

輸出一篇博客:HTTP緩存和斷點續傳標誌

4、Java併發-可重入鎖

可重入鎖,也叫做遞歸鎖,指的是同一線程 外層函數獲得鎖之後 ,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響。

在JAVA環境下 ReentrantLock 和synchronized 都是 可重入鎖。
可重入鎖最大的作用是避免死鎖。

推薦閱讀:Java鎖的種類以及辨析(四):可重入鎖

5、防抖處理

處理方式有:

1、設置點擊防抖的時間

2、RxJava之功能防抖throttleFirst

Android RxJava 實戰系列:功能防抖

3、攔截控件點擊 - 巧用ASM處理防抖

攔截控件點擊 - 巧用ASM處理防抖

6、一些APP框架佈局

(1)TabLayout + ViewPager

https://github.com/codepath/android_guides/wiki/Google-Play-Style-Tabs-using-TabLayout

(2)PagerSlidingTabStrip + ViewPager

https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip

(3)ViewPager with FragmentPagerAdapter

https://github.com/codepath/android_guides/wiki/ViewPager-with-FragmentPagerAdapter

遇到的問題

1、Kotlin泛型的坑

解決方法:如果要實現Java泛型的P extend XXClass的方式,Kotlin可以採用out P : XXClass,如果內部還需要使用泛型 P,編譯可以會報錯,可以加@UnsafeVariance解決

 public interface Collection<out E> : Iterable<E> {    
        ...     
        public operator fun contains(element: @UnsafeVariance E): Boolean   
         ...
  }

參考 https://juejin.im/entry/5962e4796fb9a06bb7522a74

2、設置沉浸式狀態欄有問題

需求是有1個Fragment頁面需要背景圖延伸到狀態欄、其他Fragment或者Activity的狀態欄是白色

解決方法是

(1)在基類Activity設置contentView延伸到狀態欄區域, 並且狀態欄爲透明

(2) 抽取一個自定義的狀態欄LinearLayout,id固定,在需要純色的狀態欄include這個layout佈局

(3) 在Activity或者Fragment基類判斷有沒有自定義的狀態欄id,有則設置狀態欄顏色、高度

//設置contentView延伸到狀態欄區域, 並且狀態欄爲透明
private fun setTransparentStatusBar() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        window.statusBarColor = Color.TRANSPARENT
        highlightStatusBarIcon() //因爲狀態欄的底色爲白色,所以設置狀態欄的文字爲暗色
    } else {
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) //4.4不能設置window.statusBarColor,默認半透明
    }
}

private fun highlightStatusBarIcon() {
    //設置狀態欄文字爲暗色
    when {
        //6.0以上可以通過直接設置SYSTEM_UI_FLAG_LIGHT_STATUS_BAR屬性即可
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ->
            window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        //21以上不支持6.0直接設置的方法,可用半透明代替,具體可自己設置
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> 
            window.statusBarColor = ContextCompat.getColor(applicationContext, R.color.black_20)
    }
}

3、如何動態添加View,如WebView,VideoView?(避免內存泄漏)

解決方法:可以在佈局文件中,添加

<FrameLayout
    android:id="@+id/web_view_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white" />

然後在代碼中添加

WebView mWebView = new WebView();
ViewGroup mWebViewRoot = mRootView.findViewById(R.id.web_view_content);
mWebViewRoot.addView(mWebView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

或者new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 

4、Fragment重疊問題(開啓開發模式中"不保留活動"容易復現)

解決方法:

(1)如果有多個Fragment初始化時, 那麼不是簡單new,而是先從FragmentManager.findFragmentByTag(tag),有就直接複製,沒有才再new,
避免創建Activity恢復Fragment數據,導致Fragment重新創建,從而出現重疊

initFragment() {
    val browserHomeFragmentTag = BrowserEntranceFragment::class.java.simpleName
    val browserHomeFragmentTemp = childFragmentManager.findFragmentByTag(browserHomeFragmentTag)
    browserEntranceFragment = if (browserHomeFragmentTemp != null) {
           browserHomeFragmentTemp as BrowserEntranceFragment
    } else {
           BrowserEntranceFragment.getInstance()
    }
}

(2)如果Activity/Fragment創建後,有跳轉某個Fragment的場景,那麼最好判斷savedInstanceState是否爲空,爲空才跳轉某個Fragment(避免恢復savedInstanceState數據時導致Fragment顯示錯亂)

(3)如果在Fragment有成員變量,而且比較重要,比如表示顯示哪個Fragment,那麼最好在onSaveInstanceState保存一下,然後在onCreate判斷savedInstanceState是否爲空,不爲空則取出來初始化成員變量

private val mCurrentFragmentKey = "CURRENT_FRAGMENT_KEY"
private var mCurrentFragmentIndex: Int = 0

override fun onCreateView(savedInstanceState: Bundle?) {
    super.onCreateView(savedInstanceState)
    //需要考慮Activity創建後Fragment恢復情況
    initFragment()
    if (savedInstanceState == null) {
        switchHome()
    } else {
        mCurrentFragmentIndex = savedInstanceState.getInt(mCurrentFragmentKey)
    }
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putInt(mCurrentFragmentKey, mCurrentFragmentIndex)
}

5、在Android4.4手機,在佈局xml文件中AppCompatImageView加點擊事件android:onClick,出現找不到這個點擊方法的崩潰

  <android.support.v7.widget.AppCompatImageView
        android:onClick="onNext" />

解決方法:

方法(1)Change android.support.v7.widget.AppCompatButton to Button.

方法(2)You can use setOnClickListener in Your Activity for Click event.

參考

https://stackoverflow.com/questions/38814267/android-support-v7-widget-tintcontextwrapper-cannot-be-cast/38814443#38814443

https://stackoverflow.com/questions/44383140/could-not-find-a-method-onclickview-in-the-activity-class-tintcontextwrapper-f

收穫體會

1、從官網中學習新知識,這是最好的資料,可以反覆查看。

在官網指導查看矢量圖原理https://developer.android.com/studio/write/vector-asset-studio 一遍看不懂可以多看幾遍

2、在APP model設置resConfigs的作用:移除未使用的替代資源
有些第三方庫(如AppCompat、Google Play Services)會包含多種語言文本,設置resConfigs的作用是隻保留需要用的語言文本,其他沒有設置的語言文本會被移除。

https://developer.android.com/studio/build/shrink-code

3、第3周可以比較好的控制情緒,遇到對方比較簡單的問題,耐心幫別人解答,而不是BS對方。以後也需要這樣,做一個有修養的人,每個人都會自己不懂的地方、基礎盲點。

4、Kotlin log寫法

Log.d(TAG, "From: ${remoteMessage?.from}")

待改進的地方

1、可以放鬆,但不能過度。有一天有點渾渾噩噩,主要是晚上沒有學習,8點半回家,9點到家,健身洗澡,10點準備學習,但是又在漫不經心的瀏覽網頁,到12點就睡覺,晚上又沒有學習。

首先,還是反省自己,爲什麼又這樣子?不想學習,沒有學習的慾望?不是,有很多想學習的,自己要時刻準備着。

爲什麼又漫不經心的瀏覽網頁?網頁有一些東西吸引了我。有時可以適當漫不經心,但要控制時間,比如10分鐘。可以放鬆,但不能過度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章