close

開發過Java的軟體人員,必定都會經過走上Thread的道路,亦或是使用Asynchronize方式等,並且能夠完全控制所有Thread狀態,但當應用到Android的時候,這些事情很多並非如你所想像中的順利,真若要談起來,就必須先瞭解JVM與Dalivk設計架構上的不同。而在這篇文章所要談的就是Android在Thread處理有什麼必須要注意的,特別是當你已經是相當資深的Java工程師卻是必須瞭解的一些狀況是事與願違的事實。

 

AsyncTask 

 

1. 在繼承這個類別的時候,請記得要先注意與瞭解以下的Android AsyncTask API限制規則,

  • The AsyncTask class must be loaded on the UI thread. This is done automatically as of JELLY_BEAN

       譯:必須是在UI Thread的狀況下讀取,在Android 4.1版完成

  • The task instance must be created on the UI thread.

       譯:一定要在UI Thread下才能夠建立使用

      譯:一定要在UI Thread下觸發execute(Params...)

      譯:禁止手動呼叫以下4個功能:onPreExecute()onPostExecute(Result)doInBackground(Params...)onProgressUpdate(Progress...)

  • The task can be executed only once (an exception will be thrown if a second execution is attempted.)

      譯:每一個任務只能執行一次(當某一任務被重覆執行,就會丟出例外錯誤)

以上規則簡單來說,當使用AsycTask一定要正在使用您發佈的APP。如果當AsycTask開發到Service的時候,Android只能跟你說我絕對不會理你,除非你先開APP,Service裡設計的AsyncTask才會執行。

 

2. 另外必須特別注意使用最大數狀況, 您也必須知道

資料來源

Before Android 1.6, the core pool size was 1 and the maximum pool size was 10. Since Android 1.6, the core pore size is 5, and the maximum pool size is 128. The size of the queue is 10 in both cases. The keep-alive timeout was 10 seconds before 2.3, and 1 second since then.

譯文

  1. Android 1.6版前,它的最大同時執行數是10, 在1.6版之後的最大同時執行數5,但最大的pool size為128。
  2. 2.3版後的timeout時間為10秒

 

3. AsyncTask的取消任務

有些開發者非常重視管理所有使用的物件管理,特別是當每個Thread的執行是否需要被取消,改由另一個Task執行,這時候Cancel就是一個相當重要的功能,很慶幸的是,Android API有提供此項功能,但很可惜的是必須告訴您,它並非立即性的關閉, 可能會需要等待約1分鐘或是更久的時間。

 

4. 令人髮指的AsyncTask

這部份是讓人不可思議的奇怪細節,還請開發者真的一定要知道,當執行完doInBackground(),再透過onPostExecute()裡面的method的實作,用來最後更新UI的畫面,然而這一切應該是要非常順利,但各位開發者們,請不要很天真的相信它會執行,有時候它就是不執行該onPostExecute,雖然API文件說onPostExecute除非操作Cancel(),否則就會觸發(原文:This method won't be invoked if the task was cancelled.),這文件說明就是完全看不出任何的保證Google工程師寫出來的程式就是有品質。而這最後的解決的辦法卻是要用Looper.prepare(),但我還是要告訴你,這還是會有Exception的問題,並非是最佳解。 但依個人使用之經驗,我就是違反了Android API第4項規則,檢查該Looper是否有問題,再手動執行onPostExecute(),目前已經測試結果已經超過上百次以上,完全沒有任何意外問題,而且還非常的順利。如果各位對這上百次以上的測試有所懷疑,可以請各位自行操作至少上萬次、 上千萬次,但我只能跟你說,依目前就算測試原來的Anddroid自定規則不到上百次,就已經有問題了,我目前使用的測試Android版本為4.x, 5.x版‧  

 

居印室內裝修股份有限公司

 

arrow
arrow

    nandin 發表在 痞客邦 留言(0) 人氣()