標籤:des height val cep 使用 ++ tin oncreate android
第一章 AsyncTask的基本構成
為是麼要非同步任務
1)Android單執行緒模式
2)耗時操作放在非主線程中執行
AsyncTask為何而生
1)子線程中跟新UI
2)封裝、簡化非同步作業
public class MyAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) {//必須重寫,其他方法沒有規定必須重寫 // TODO 自動產生的方法存根 Log.d("TAG", "doInBackground"); publishProgress();//輸入的參數會在onProgressUpdate()方法中擷取到 return null; } @Override protected void onPreExecute() { // TODO 自動產生的方法存根 super.onPreExecute(); Log.d("TAG", "onPreExecute"); } @Override protected void onPostExecute(Void result) { // TODO 自動產生的方法存根 super.onPostExecute(result); Log.d("TAG", "onPostExecute"); } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); Log.d("TAG", "onProgressUpdate");}}//另類MyAsyncTask task=new MyAsyncTask();task.execute();//類似線程中的start()方法Ps:順序:onPreExecute()->doInBackground(Params...)->調用publishProgress(Progress...)->onProgressUpdate(Progress...)->doInBackground(Params...)執行結束->onPostExecute(Result)
第二章 AsyncTask的使用樣本
網路操作作為不穩定的廢時操作,從android 4.0開始就被嚴禁放入主線程中通常採用在非同步線程處理下載映像在UI線程設定映像ProgressBar XML屬性 visibility="gone"可設定為預設狀態下為隱藏VISIBLE:設定控制項可見INVISIBLE:設定控制項不可見GONE:設定控制項隱藏而INVISIBLE和GONE的主要區別是:當控制項visibility屬性為INVISIBLE時,介面保留了view控制項所佔有的空間;而控制項屬性為GONE時,介面則不保留view控制項所佔有的空間。
URLConnection connection //定義網路對象<br>ImputString is//定義用於擷取資料的輸入資料流<br>connection=new URL(url).openConnection();//擷取網路連接對象<br>is= connection.getInputStream();//獲得輸入資料流<br>BufferedInputStream bis=new BufferedInputStream(is);//封裝輸入資料流<br>bitmap=BitmapFactory.decodeStram(bis);將輸入資料流解析成bitmap<br>is.close();<br>bis.close();//關閉輸入資料流<br>1.擷取傳遞進來的參數值<br>string url=params[0];<br>2.訪問網的操作<br>建立串連--設定輸入資料流--封裝輸入資料流--decode輸出資料流,轉化為所需要的檔案--關閉輸入資料流和封裝流最後將所需要的檔案返回
上述方法是寫在doInBackground()裡面的。
通過OnProExcute方法和onPostExcute方法操作UI設定映像mProgressBar.setVisbility(View.VISIBLE)顯示進度條onPostExcute(BitMap bitmap)//bitmap為doingbackground方法返回的一個bitmap在Main方法中,調用MyAsycTask的execute方法傳入(URL)通過AsyncTask的執行個體調用execute方法就可以開啟AsyncTask的非同步作業,在execute方法中傳入一個或多個參數作為我們doingbackground方法中所傳進來的一個參數在AsyncTask的OnPreExecute方法中調用初始化的方法,在後台啟動非同步作業提示使用者等待,調用真正的doingBackGround方法開始真正的非同步處理,這裡的整個方法都是現在子線程之中,在這個方法中進行所有的耗時操作,並將所要返回的值返回到我們所設定的值的類型中,在OnpostExecute方法中獲得我們所返回的結果,onPostExcute方法也運行在主線程之中從而我們可以對UI進行操作,這就是AsyncTask所要調用的整個流程在Mainfest中開通所要訪問的網路許可權
onPreExecute() 顯示進度條onPostExcute()隱藏進度條 都可以訪問UI線程mytask.execute(args)中傳入的參數就是doInBackground中的參數onPreExecute--載入進度條doInBackGround--下載網路資料(耗時操作)onPostExecute--顯示圖片與UI線程通訊在onPreExecute()方法中mProgressBar.setVisibility(View.VISIBLE);//顯示進度條在onPostExectute(Bitmap bitmap)方法中,參數是doInBackground()方法返回的參數mProgressBar.setVisibility(View.GONE);//將進度條隱藏mImageView.setImageBitmap(bitmap);//將圖片設定為解析出來的網狀圖片然後在onCreate方法中new MyAsyncTask().execute(URL);//開啟AsyncTask的非同步線程操作,設定傳遞進去的參數
第三章 AsyncTask類比進度條
在AsyncTask的doInBackground()方法中調用publishProgress()方法可以將我們處理任務的進度反饋處理,
我們這個時候就是用AsyncTask的onProgressUpdate()方法來承接我們傳出來的進度,注意,由於在AsyncTask中,
只有doInBackground()方法是工作在子線程中的,所以我們可以放心地在onProgressUpdate()方法中更新UI
for(int i=0;i<100;i++){publishProgress(i);try{Thread.sleep(300);} catch(InterruptedException e){e.printStackTrace();}}onProgressUpdate(Integer...values){super.onProgressUpdate(values);//擷取進度更新值mProgressBar.setProgress(values[0]);}
AsyncTask預設情況下會等待前一個線程執行完畢後再執行下一個線程,要取消該機制,可以讓AsyncTask和Activity的生命週期保持一致protected void onPause(){super.onPause();if(mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING){//只是發送了一個取消請求,將AsyncTask標記為cancel狀態,但未真正取消線程的執行//實際上JAVA語言沒辦法粗暴地直接停止一個正在啟動並執行線程mTask.cancel(true);}}所以需要在doInBackground方法和onProgressUpdate方法中增加isCancelled()方法進行判斷,標記為cancel的,則跳出迴圈,儘快結束當前線程的剩餘操作,開始下一個線程AsyncTask實現的機制:底層通過線程池來作用的,當我們一個線程沒有執行完畢時,後面的線程是無法執行的;調用cancel方法去cancel一個asynctask線程,並沒有將這個線程直接停止掉,只是給這個asynctask發送了一個cancel請求,將它標識為cancel狀態;在java中是無法直接將一個線程粗暴地停止掉,我們必須等一個線程執行完畢後才能做後面的操作。(需通過狀態值判斷去跳出子線程的迴圈操作)只有doInBackground是在非UI線程中執行mytask!=null&&mytask.getStatus()== AsyncTask.Status.RUNNINGansystask 即使cancel設定為true 也不能立即取消,只是將狀態設為取消故在doInBackground和onUpdatexx的時候檢測isCancled()是不是true
doInBackground()方法運行在非主線程,其他三個方法運行在主線程,所以可以在doInBackground做非同步作業,在其他三個方法中更新UI。正是因為有了onProgressUpdate()和onPostExcute()方法,才可以在非同步處理的過程中更新UI。
Android必學——AsyncTask