我們都知道Android是單線程模型,這意味著Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行,所以你單純的new一個Thrad並且start()不行的,因為這違背瞭Android的單線程模型。
很幸運的是Android為我們提供瞭在其他線程中訪問UI線程的方法,相信大傢都見過,這幾個就是Activity的runOnUiThread方法,View的post和postDelayed方法,以及最常用的Hanlder和AsyncTask,這裡我推薦使用Hanlder和AsyncTask,尤其是AsyncTask,因為使用他們你會發現你的代碼很容易被理解,因為他們都有一些具有特定職責的方法,尤其是AsyncTask,有預處理的方法onPreExecute,有後臺執行任務的方法doInBackground,有更新進度的方法publishProgress,有返回結果的方法onPostExecute等等,這就不像post這些方法,把所有的操作都一大坨的寫在一個Runnable裡。
有瞭Android為我們提供瞭這些方法我們就可以很好的解決一些長時間處理的任務瞭,但是在使用的時候我們還必須註意以下幾點:
這些方法或者類必須在在UI線程中創建和調用
其實這些方法和類最終的實現都是Android的Message、MessageQueue和Looper的機制,所以不要期待你會馬上看到結果(效果),因為這是一個Loop一直循環出MessageQueue中的Message執行的過程,如果你沒有看到效果,那麼等等吧,因為還沒有輪到你。
有線程(多個)的地方就會有並發,會有資源共享沖突,所以在使用的時候謹慎點吧,說不準你的一個線程中使用的變量已經被另一個線程改的面目全非瞭。。