日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AsyncTask的使用半解--!

發布時間:2023/12/9 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AsyncTask的使用半解--! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AsyncTask,即異步任務,是Android給我們提供的一個處理異步任務的類.通過此類,可以實現UI線程和后臺線程進行通訊,后臺線程執行異步任務,并把結果返回給UI線程.

.為什么需要使用異步任務?

我們知道,Android中只有UI線程,也就是主線程才能進行對UI的更新操作,而其他線程是不能直接操作UI的.這樣的好處是保證了UI的穩定性和準確性,避免多個線程同時對UI進行操作而造成UI的混亂.但Android是一個多線程的操作系統,我們總不能把所有的任務都放在主線程中進行實現,比如網絡操作,文件讀取等耗時操作,如果全部放到主線程去執行,就可能會造成后面任務的阻塞.Android會去檢測這種阻塞,當阻塞時間太長的時候,就會拋出Application Not Responsed(ANR)錯誤.所以我們需要將這些耗時操作放在非主線程中去執行.這樣既避免了Android的單線程模型,又避免了ANR.

.AsyncTask為何而生?

提到異步任務,我們能想到用線程,線程池去實現.確實,Android給我們提供了主線程與其他線程通訊的機制.但同時,Android也給我們提供了一個封裝好的組件–AsyncTask.利用AsyncTask,我們可以很方便的實現異步任務處理.AsyncTask可以在子線程中更新UI,也封裝簡化了異步操作.使用線程,線程池處理異步任務涉及到了線程的同步,管理等問題.而且當線程結束的時候還需要使用Handler去通知主線程來更新UI.而AsyncTask封裝了這一切,使得我們可以很方便的在子線程中更新UI.

.構建AsyncTask子類的泛型參數

AsyncTask

public class NewThread2 extends Activity {private TextView text1;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text1 = (TextView) findViewById(R.id.text1);Button btn = (Button) findViewById(R.id.btn1);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubreadUrl("https://www.baidu.com");}});}public void readUrl(String Url) {new AsyncTask<String, Void, String>() {// 此方法必須重寫,異步執行后臺線程需要完成的任務@Overrideprotected String doInBackground(String... params) {try {URL url = new URL(params[0]);URLConnection connection = url.openConnection();InputStream is = connection.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader bis = new BufferedReader(isr);String Line;StringBuilder builder = new StringBuilder();while ((Line = bis.readLine()) != null) {builder.append(Line);}bis.close();isr.close();is.close();return builder.toString();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}// 執行后臺耗時操作時前被調用,通常用來完成一些初始化操作@Overrideprotected void onPreExecute() {Log.d("TAG", ">>>>>>>>>>>>>>>>>>>");// TODO Auto-generated method stubsuper.onPreExecute();}// 當doinBackground()完成過后,系統自動調用,并將方法的返//回值傳給onpostexecute()可運行在主線程操作ui@Overrideprotected void onPostExecute(String result) {// TODO Auto-generated method stubtext1.setText(result);super.onPostExecute(result);}// doinBackground()方法中調用publishProgress()方法更行任務的執行進度后,就會觸發該方法@Overrideprotected void onProgressUpdate(Void... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);}@Overrideprotected void onCancelled(String result) {// TODO Auto-generated method stubsuper.onCancelled(result);}@Overrideprotected void onCancelled() {// TODO Auto-generated method stubsuper.onCancelled();}}.execute(Url);} }

新啟一個線程來讀取網站、、、

AsyncTask是基于線程池進行實現的,當一個線程沒有結束時,后面的線程是不能執行的.
cancel方法只是將對應的AsyncTask標記為cancelt狀態,并不是真正的取消線程的執行.
onCancelled()方法被調用后,onPostExecute(Result result)方法將不再被調用。

.使用AsyncTask的注意事項

① 必須在UI線程中創建AsyncTask的實例.

② 只能在UI線程中調用AsyncTask的execute方法.

③ AsyncTask被重寫的四個方法是系統自動調用的,不應手動調用.

④ 每個AsyncTask只能被執行(execute方法)一次,多次執行將會引發異常.

⑤ AsyncTask的四個方法,只有doInBackground方法是運行在其他線程中,其他三個方法都運行在UI線程中,也就說其他三個方法都可以進行UI的更新操作.

詳解請看大神博客
http://blog.csdn.net/liuhe688/article/details/6532519

轉載于:https://www.cnblogs.com/Tesi1a/p/7624161.html

總結

以上是生活随笔為你收集整理的AsyncTask的使用半解--!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。