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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android AsyncTask分析

發(fā)布時間:2025/7/14 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android AsyncTask分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

---恢復內容開始---

因為android的UI線程是不安全的,如果你UI線程里執(zhí)行一些耗時任務,很容易就導致程序崩潰。并且目前網絡任務也不能夠在UI線程里執(zhí)行。處理這些問題除了直接寫一個線程以外,Android還提供一個AsyncTask(異步任務類)來更簡單的處理一些耗時任務。

?

AsyncTask<>是一個抽象類,通常用于繼承,繼承時需要指定三個泛型參數。

1、Params:啟動任務時傳入的參數的類型。這是一個數組,可以傳多個參數。調用時使用params[0]、params[1]、params[2]來獲取。

2、Progress:后臺任務完成的進度值的類型。

3、Result:后臺任務執(zhí)行完畢返回結果的類型。

?

使用AsyncTask需要如下三步:

1、繼承抽象類,實現(xiàn)一個子類,傳入三個泛型參數。如果有參數不需要使用可設為Void。

2、根據需要,可實現(xiàn)以下方法。

  • doInBackground(Params...):該方法是必須的,這個方法下寫的是后臺線程要執(zhí)行的任務,并且會在子線程運行(其他方法都是在UI線程執(zhí)行)。。該方法可以調用publicProgress(Progress...values)方法更新任務的進度。
  • onProgressUpdate(Progress... values):該方法在上一步調用publicProgress時觸發(fā)。
  • onPreExecute():該方法會在執(zhí)行doInBackground方法前執(zhí)行,用于做一些準備工作。
  • onPostExecute(Result result):當doInBackground執(zhí)行結束之后,系統(tǒng)會自動調用該方法,返回值也會傳到此函數。我們可以在這里完成后臺線程執(zhí)行后的結果。

3、最后用新建我們繼承類后的結果,然后調用execute(Params... params)。

  注意:對象必須在UI線程中創(chuàng)建、execute方法必須在UI線程中調用、以上四個方法都需系統(tǒng)自動調用、每個對象只能被執(zhí)行一次,多次調用引發(fā)異常。

?

實例

講了那么多鋪墊,讓我們來講個例子吧~

我現(xiàn)在想從互聯(lián)網上下載一張圖片,就使用這個AsyncTask來做一下吧~

?為讓所有方法都實現(xiàn)一次,我們用兩種方法實現(xiàn):1、下載完畢后直接進行顯示。2、一邊加載一邊顯示進度,加載完畢顯示圖片。

下面是第一種的代碼,相對簡單一點,只用了兩個函數。

public class MainActivity extends Activity {int downloadSize;int fileSize;Button bn;ImageView iv;ProgressBar progressBar;String url = "http://ww1.sinaimg.cn/mw690/6aa88161gw1eqqbw7h821j20hs0hsaba.jpg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bn = (Button) findViewById(R.id.down);iv = (ImageView) findViewById(R.id.image);MyOnClickListener myOnClickListener = new MyOnClickListener();bn.setOnClickListener(myOnClickListener);}class MyOnClickListener implements android.view.View.OnClickListener{@Overridepublic void onClick(View v) {AsyncDownload asyncDownload = new AsyncDownload();asyncDownload.execute(url);} }class AsyncDownload extends AsyncTask<String, Integer, Bitmap>{@Overrideprotected Bitmap doInBackground(String... params) {String imageUrl = params[0];URL url;try {url = new URL(imageUrl);InputStream is = url.openStream();BitmapFactory.Options op = new BitmapFactory.Options();op.inSampleSize = 2;Bitmap bitmap = BitmapFactory.decodeStream(is, null,op);} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}@Overrideprotected void onPostExecute(Bitmap result) {super.onPostExecute(result);iv.setImageBitmap(result);}} }

上面的代碼的功能是點擊按鈕,然后doInBackground后臺下載圖片,下載完畢onPostExecute顯示圖片。僅僅使用了兩個函數,但是實現(xiàn)了AsyncTask的核心功能。

?

然后讓我們感受一下能夠顯示進度的。

public class MainActivity extends Activity {int downloadSize;int fileSize;Button bn;ImageView iv;ProgressBar progressBar;String url = "http://ww1.sinaimg.cn/mw690/6aa88161gw1eqqbw7h821j20hs0hsaba.jpg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bn = (Button) findViewById(R.id.down);iv = (ImageView) findViewById(R.id.image);progressBar = (ProgressBar) findViewById(R.id.bar);MyOnClickListener myOnClickListener = new MyOnClickListener();bn.setOnClickListener(myOnClickListener);}Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {}};class MyOnClickListener implements android.view.View.OnClickListener{@Overridepublic void onClick(View v) {AsyncDownload asyncDownload = new AsyncDownload();asyncDownload.execute(url);} }class AsyncDownload extends AsyncTask<String, Integer, Void>{@Overrideprotected Void doInBackground(String... params) {String imageUrl = params[0];try {URL url = new URL(imageUrl);URLConnection conn = url.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); fileSize = conn.getContentLength(); publishProgress(0x111);FileOutputStream fos = new FileOutputStream(getPath());byte[] bytes = new byte[1024]; int len = -1; while((len = is.read(bytes))!=-1) { fos.write(bytes, 0, len); downloadSize+=len; publishProgress(0x222);} publishProgress(0x333);is.close(); fos.close(); } catch (MalformedURLException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}return null; }@Overrideprotected void onProgressUpdate(Integer... values) {super.onProgressUpdate(values);switch(values[0]){case 0x111:progressBar.setMax(fileSize);break;case 0x222:progressBar.setProgress(downloadSize);break;case 0x333:try { if(getPath().endsWith(".jpg")||getPath().endsWith(".png")){ FileInputStream fis = new FileInputStream(getPath()); iv.setImageBitmap(BitmapFactory.decodeStream(fis)); } downloadSize = 0; fileSize = 0; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } break;}}}public String getPath() {File root = getExternalCacheDir();if (root != null){return root.getAbsolutePath() + "test.jpg";}return null;} }

這里實現(xiàn)的功能是點擊下載按鈕,后臺從互聯(lián)網加載文件,首先獲取文件大小,設置progressbar最大值,然后一邊下載、一邊存入本地、一邊設置progressbar的值,實現(xiàn)進度條。下載完畢從本地獲取圖片顯示出來。這一次多使用了顯示進度的函數onProgressUpdate。

?

其實,onProgressUpdate這個函數一般我們在線程里會用Handler來實現(xiàn)。

在AsyncTask給我們把平常使用線程進行異步操作的所用東西打包在一起了,不得不說確實省了一些事。

實際上能夠用AsyncTask實現(xiàn)的東西完全可以直接用線程來實現(xiàn)~

?

我在些第二個代碼的時候寫順了手,用Handler實現(xiàn)了一遍,大家在下面可以看一下。

public class MainActivity extends Activity {int downloadSize;int fileSize;Button bn;ImageView iv;ProgressBar progressBar;String url = "http://ww1.sinaimg.cn/mw690/6aa88161gw1eqqbw7h821j20hs0hsaba.jpg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bn = (Button) findViewById(R.id.down);iv = (ImageView) findViewById(R.id.image);progressBar = (ProgressBar) findViewById(R.id.bar);MyOnClickListener myOnClickListener = new MyOnClickListener();bn.setOnClickListener(myOnClickListener);}Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {switch(msg.what){case 0x111:progressBar.setMax(fileSize);break;case 0x222:progressBar.setProgress(downloadSize);break;case 0x333:try { if(getPath().endsWith(".jpg")||getPath().endsWith(".png")){ FileInputStream fis = new FileInputStream(getPath()); iv.setImageBitmap(BitmapFactory.decodeStream(fis)); } downloadSize = 0; fileSize = 0; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } break;}}};class MyOnClickListener implements android.view.View.OnClickListener{@Overridepublic void onClick(View v) {AsyncDownload asyncDownload = new AsyncDownload();asyncDownload.execute(url);} }class AsyncDownload extends AsyncTask<String, Integer, Void>{@Overrideprotected Void doInBackground(String... params) {String imageUrl = params[0];try {URL url = new URL(imageUrl);URLConnection conn = url.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); fileSize = conn.getContentLength(); handler.sendEmptyMessage(0x111);FileOutputStream fos = new FileOutputStream(getPath());byte[] bytes = new byte[1024]; int len = -1; while((len = is.read(bytes))!=-1) { fos.write(bytes, 0, len); downloadSize+=len; handler.sendEmptyMessage(0x222);} handler.sendEmptyMessage(0x333);is.close(); fos.close(); } catch (MalformedURLException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}return null; }}public String getPath() {File root = getExternalCacheDir();if (root != null){return root.getAbsolutePath() + "test.jpg";}return null;} }

?

啦啦啦,就到這里吧~

轉載于:https://www.cnblogs.com/glimpse/p/5280942.html

總結

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

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

主站蜘蛛池模板: 蜜桃视频一区二区在线观看 | 亚洲av电影天堂男人的天堂 | 天天色天天射天天干 | 精品国产精品网麻豆系列 | 日本一本一道 | 青春草av | 成人午夜影视在线观看 | 日老女人视频 | av在线入口 | 国产又粗又猛视频 | 国产一级大片在线观看 | 亚洲福利电影网 | 人妻妺妺窝人体色www聚色窝 | 99热都是精品 | 最近中文字幕mv | 无码人妻精品一区二区三区99日韩 | 五月婷婷激情 | 91在线无精精品入口 | 午夜日韩福利 | 看全色黄大色黄大片大学生 | 无码人妻一区二区三区线 | 国产乱人乱精一区二视频国产精品 | 裸体喂奶一级裸片 | 国产精品久久..4399 | 中文字幕视频网 | 国产精品中文在线 | 日本免费视频 | 国产精品久久久久久福利 | 亚洲经典在线观看 | 可以免费看污视频的网站 | 中文久久乱码一区二区 | 日韩精品中文字幕在线播放 | 亚洲av熟女国产一区二区性色 | 国产乱码视频 | 超碰中文在线 | 亚洲成a人片77777精品 | 午夜dv内射一区二区 | 欧美乱妇狂野欧美视频 | 欧洲精品在线观看 | 精品免费在线观看 | 自拍偷拍21p | 激情欧美在线 | 波多一区二区 | 中文字幕在线播放日韩 | 久久久久国色av免费观看性色 | 亚洲 国产 欧美 日韩 | 极品福利视频 | 青青草精品在线视频 | 亚洲一区二区三区乱码 | 大地资源影视在线播放观看高清视频 | 男人操女人免费网站 | 九九精品视频在线 | 午夜剧场免费在线观看 | 中文字幕亚洲国产 | 不卡日韩| 在线看你懂得 | 国产又色又爽又黄的 | 免费观看黄色一级视频 | 影音先锋美女 | 久久精品国产大片免费观看 | 黄色网络在线观看 | 无码日本精品xxxxxxxxx | 久久久久色 | 亚洲夜夜操 | 男生和女生一起搞鸡 | 99自拍视频 | 三上悠亚 在线观看 | 蜜桃视频污| 丝瓜色版| 欧美日韩日本国产 | 亚洲男女在线观看 | 97在线视频免费观看 | 精品一区二区日韩 | 密桃成熟时在线观看 | 免费在线观看www | 精品久久久无码中文字幕 | 丝袜制服一区 | 男女羞羞无遮挡 | 中文第一页 | 五月婷婷综合在线 | 羞视频在线观看 | 国产精品人人妻人人爽人人牛 | 精品福利在线观看 | 欧美另类z0z变态 | 日韩av一区二区在线观看 | a资源在线 | 午夜成人免费电影 | 亚洲成人黄色在线 | 美女国产毛片a区内射 | 精品成人在线观看 | 97超碰人人澡人人爱学生 | 91精品视频一区二区三区 | 国偷自产视频一区二区久 | 色峰视频 | 国产中文字字幕乱码无限 | 亚洲精品乱码久久久久久蜜桃91 | 天天操天天操天天操 | 亚洲一线av | 91亚洲精品国偷拍自产在线观看 |