關於android ListView倒計時遇到的一些問題



馬自達電商項目已經開發接近尾聲馬上進行提測了,近期遇到一個說大不小,說小但也令人糾結的一個問題,今天終於解決,記錄一下避免以後走彎路

首頁一共四個倒計時,結構爲 Activity-->Fragment--><LinearLayout>-->PulltoRefreshListView-->GridView

問題一:

每個item開了一個倒計時來更新自己,每次更新自己使用notifyDataSetChanged()來更新全部列表,以達到顯示更新倒計時目的,但是每個item都調用一次 notifyDataSetChanged這個方法導致界面一直在刷新,界面卡死,用戶無法操作

解決方法

給顯示倒計時的控件設置一個全局變量,並進行引用,每次更新的時候局部刷新即可,不用每次都全部刷新整個列表

問題二:

執行倒計時的多個線程一直在執行,不管是否已在本頁或已經退出應用(很浪費內存)

解決方法:試着利用fragment的onstart()  onstop()的生命週期 ,設置一個開關定時器標籤,並在定時器執行線中程進行判斷來達到控制定時器停止,開啓

小問題1:經過長時間的測試發現pulltoRefreshListView 控件在Activity--Fragment--Pulltorefresh這種結構下面 在綁定完數據源以後 再更新數據的時候getView()不執行

解決方法:因爲時間問題沒有辦法解決上面bug  所以換成XListView

小問題2:雖然換成XListVIew解決了上述getView()不執行的問題,但是在fragment的onStop()生命週期下還是不執行getView()

解決方法:既然無法通過執行getView()傳值給裏面的listview來控制定時器的執行,可以通過定時器在執行時候順便獲取一個存在固定位置的值並判斷自己是否要繼續執行,只需要在執行生命週期的時候更改相應的值,即可停止相應定時器,避免高內存的持續佔用

問題三:

由於定時器是在最內層GridView的adapter中,所以每次執行getVIew的時候便會啓動一個定時器,而在解決問題一的時候又引出更新倒計時顯示每次給固定變量設置值的時候執行getView(),然後再次啓動一個線程中的定時器,結果自然是線程和定時器翻倍增長。線程和定時器多了,並且用戶一直在這個界面不操作的話會導致內存急劇升高。

解決方法:

在每次啓動定時器的時候,給當前顯示倒計時的控制設置一個tag 此標籤作用爲指示本控件是否綁定了一個定時器,如果綁定了就不再啓動定時器。再結合convetView的複用,完美解決了定時器會多次啓動的問題


值此 主導開發的馬自達電商項目問題已基本解決,等提測修復bug上線了,做個標記






馬自達電商項目已經開發接近尾聲馬上進行提測了,近期遇到一個說大不小,說小但也令人糾結的一個問題,今天終於解決,記錄一下避免以後走彎路

首頁一共四個倒計時,結構爲 Activity-->Fragment--><LinearLayout>-->PulltoRefreshListView-->GridView

問題一:

每個item開了一個倒計時來更新自己,每次更新自己使用notifyDataSetChanged()來更新全部列表,以達到顯示更新倒計時目的,但是每個item都調用一次 notifyDataSetChanged這個方法導致界面一直在刷新,界面卡死,用戶無法操作

解決方法

給顯示倒計時的控件設置一個全局變量,並進行引用,每次更新的時候局部刷新即可,不用每次都全部刷新整個列表

問題二:

執行倒計時的多個線程一直在執行,不管是否已在本頁或已經退出應用(很浪費內存)

解決方法:試着利用fragment的onstart()  onstop()的生命週期 ,設置一個開關定時器標籤,並在定時器執行線中程進行判斷來達到控制定時器停止,開啓

小問題1:經過長時間的測試發現pulltoRefreshListView 控件在Activity--Fragment--Pulltorefresh這種結構下面 在綁定完數據源以後 再更新數據的時候getView()不執行

解決方法:因爲時間問題沒有辦法解決上面bug  所以換成XListView

小問題2:雖然換成XListVIew解決了上述getView()不執行的問題,但是在fragment的onStop()生命週期下還是不執行getView()

解決方法:既然無法通過執行getView()傳值給裏面的listview來控制定時器的執行,可以通過定時器在執行時候順便獲取一個存在固定位置的值並判斷自己是否要繼續執行,只需要在執行生命週期的時候更改相應的值,即可停止相應定時器,避免高內存的持續佔用

問題三:

由於定時器是在最內層GridView的adapter中,所以每次執行getVIew的時候便會啓動一個定時器,而在解決問題一的時候又引出更新倒計時顯示每次給固定變量設置值的時候執行getView(),然後再次啓動一個線程中的定時器,結果自然是線程和定時器翻倍增長。線程和定時器多了,並且用戶一直在這個界面不操作的話會導致內存急劇升高。

解決方法:

在每次啓動定時器的時候,給當前顯示倒計時的控制設置一個tag 此標籤作用爲指示本控件是否綁定了一個定時器,如果綁定了就不再啓動定時器。再結合convetView的複用,完美解決了定時器會多次啓動的問題


值此 主導開發的馬自達電商項目問題已基本解決,等提測修復bug上線了,做個標記





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