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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android中异步任务AsyncTask的使用

發布時間:2023/12/3 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中异步任务AsyncTask的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、當程序啟動的時候,Android同時會啟動一個對應的線程,【主線程、UI線程】主要負責處理與UI相關的線程
2、UI線程不允許訪問網絡進行耗時操作
3、子線程不允許更新UI。
由于Android中主線程不能訪問網絡、子線程不能更新UI,需要線程間通訊 完成數據對象傳遞。Android在1.5版本引入了AsyncTask. AsyncTask的特點是任務在主線程之外運行,而回調方法是在主線程中執行,這就有效地避免了使用Handler帶來的麻煩。閱讀AsyncTask的源碼可知,AsyncTask是使用java.util.concurrent 框架來管理線程以及任務的執行的,concurrent框架是一個非常成熟,高效的框架,經過了嚴格的測試。這說明AsyncTask的設計很好的解決了匿名線程存在的問題。
AsyncTask定義了三種泛型類型 Params,Progress和Result.
子類必須實現抽象方法doInBackground(Params… p) ,在此方法中實現任務的執行工作,比如連接網絡獲取數據等。通常還應該實現onPostExecute(Result r)方法,因為應用程序關心的結果在此方法中返回。需要注意的是AsyncTask一定要在主線程中創建實例。
onPreExecute()當任務執行之前開始調用此方法,可以在這里顯示進度對話框。
doInBackground(Params…)此方法在后臺線程執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress…)來更新任務的進度。
onProgressUpdate(Progress…)此方法在主線程執行,用于顯示任務執行的進度。
onPostExecute(Result)此方法在主線程執行,任務執行的結果作為此方法的參數返回。

實例::
xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.zjs.imageview.IntentActivity"><Buttonandroid:id="@+id/down_load"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="下載圖片"/><ImageViewandroid:id="@+id/downloadimage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:background="@android:color/holo_red_light"/> </LinearLayout>

Activity::

package com.zjs.imageview;import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast;import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;public class IntentActivity extends AppCompatActivity implements View.OnClickListener {private ProgressDialog dialog;private ImageView mImage;private Button mDown_load;private String path = "http://cdnq.duitang.com/uploads/item/201505/20/20150520102944_CiL3M.jpeg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_intent);init();mImage = (ImageView) findViewById(R.id.downloadimage);mDown_load = (Button) findViewById(R.id.down_load);mDown_load.setOnClickListener(this);}private void init() {mImage = (ImageView) findViewById(R.id.downloadimage);mDown_load = (Button) findViewById(R.id.down_load);mDown_load.setOnClickListener(this);dialog = new ProgressDialog(this);dialog.setCancelable(true);dialog.setTitle("提醒");dialog.setMessage("正在下載中...");dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);}@Overridepublic void onClick(View view) {new DownLoadImageTask().execute(path);}private class DownLoadImageTask extends AsyncTask<String, Integer, Bitmap> {@Overrideprotected void onPreExecute() {dialog.show();super.onPreExecute();}@Overrideprotected Bitmap doInBackground(String... params) {URL myFileUrl = null;Bitmap bitmap = null;InputStream is = null;HttpURLConnection conn = null;try {myFileUrl = new URL(params[0]);} catch (MalformedURLException e) {e.printStackTrace();}try {conn = (HttpURLConnection) myFileUrl.openConnection();conn.setDoInput(true);conn.connect();is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);is.close();} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {is.close();}if (conn != null) {conn.disconnect();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return bitmap;}@Overrideprotected void onProgressUpdate(Integer... values) {dialog.setProgress(values[0]);super.onProgressUpdate(values);}@Overrideprotected void onPostExecute(Bitmap result) {if (result != null) {mImage.setImageBitmap(result);Toast.makeText(getApplication(), "下載成功", Toast.LENGTH_LONG).show();} else {Toast.makeText(getApplication(), "下載失敗", Toast.LENGTH_LONG).show();}dialog.dismiss();super.onPostExecute(result);}}public Bitmap getBitmapFromNet(String Imagepath) {HttpURLConnection conn;try {URL url = new URL(Imagepath);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("get");conn.setDoInput(true); //允許輸入流,即允許下載conn.setDoOutput(true); //允許輸出流,即允許上傳conn.setUseCaches(false); //不使用緩沖conn.setRequestMethod("GET"); //使用get請求conn.connect();if (conn.getResponseCode() == 200) {Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream());if (bitmap != null) {return bitmap;}} else {Toast.makeText(this, "網絡連接失敗", Toast.LENGTH_SHORT).show();}} catch (Exception e) {e.printStackTrace();}return null;} }

經過測試,可以實現圖片下載。

總結

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

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