亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中AsyncTask如何使用

發布時間:2021-06-26 17:12:52 來源:億速云 閱讀:152 作者:Leah 欄目:移動開發

今天就跟大家聊聊有關Android中AsyncTask如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

1、首先我們來看看AsyncTask 的介紹:  

   Handler 和 AsyncTask 都是android 中用來實現異步任務處理的方式;其中:

    Handler 實例向 UI 線程發送消息,完成界面更新, 

        優點:對整個過程控制的比較精細;
        缺點:代碼相對臃腫,多個任務同時執行時,不易對線程進行精確的控制;

    AsyncTask :比Handler 更輕量級一些,適用于簡單的異步處理; 

        優點:簡單 | 快捷 | 過程可控;
        缺點:使用多個異步操作時就變得復雜起來;

2、AsyncTask 的定義:(AsyncTask 定義了三種泛型類型) 

  public abstract class AsyncTask<Params,Progress,Result>{...}

    說明: 

        Params :啟動任務執行的輸入參數,例如:HTTP 請求的URL;
        Progress: 后臺任務執行的百分比;
        Result:后臺執行任務最終返回的結果,比如String;

3、AsyncTask 異步任務的執行步驟:(以下方法除execute(Params... params),在AsyncTask中重寫),下列是相關方法的介紹:

    A、execute(Params... params) : 

        執行一個異步任務,需要我們在UI線程中調用,觸發任務

    B、OnPreExecute(): 

        execute(Params... params)調用后立即執行,一般用于在執行后臺任務前對UI做一些標記; 例如,可以在此處顯示進度對話框;

    C、doInBackground(Params.. params): 

        onPreExecute() 完成后執行,后臺執行,處理比較耗時的操作;此處不能操作UI,執行的過程中調用publishProgress(Progress... values)來更新進度信息;

    D、onProgressUpdate(Progress... values): 

        在調用publicshProgress(Progress... values)方法執行,直接將進度信息更新到UI組建上;此方法在主線程上執行,用于顯示任務執行的進度;

    E、onPostExecute(Result result): 

        此方法在主線程中執行,當后臺的操作結束時,此方法會被調用,計算結果作為參數傳遞到此方法中,直接將結果顯示到UI組建上。

    F、cancel(); : 

        取消一個正在執行的任務,在UI線程中完成,用AsyncTask的對象進行調用,參數為true/false;

4、使用AsyncTask 時注意事項: 

    A、異步任務實例必須在UI線程中創建;
    B、execute(Params... params) 方法必須在UI線程中調用;
    C、不要手動的調onPreExecute().doInBackground().onProgressUpdate().onPostExecute()這幾個方法;
    D、不能在doInBackground(Params... params) 中更改組件信息;
    E、一個任務實例只能執行一次,如果執行第二次會拋出異常;

5、案例:使用AsyncTask 實現圖片的下載:

    Activity類,主程序的入口:

  public class MainActivity extends Activity { 
 
  // 程序入口 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    MyAsyncTask my = new MyAsyncTask(); 
    my.execute("https://cache.yisu.com/upload/information/20200623/125/126590.jpg"); 
  } 
 
}

   AsyncTask 派生類,實現異步任務:

  package com.sun.asynctask; 
 
import java.io.ByteArrayOutputStream; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
 
import org.apache.http.HttpConnection; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.HttpStatus; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.util.Log; 
 
/** 
 * 異步任務,實現網頁內容的獲取 
 * 
 * 
 * 生成該類的對象,并調用execute方法之后 
 * 
 * 首先執行的是onProExecute() 方法, 
 * 
 * 其次執行的doInBackground()方法 
 */ 
public class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> { 
 
  /** 
   * 在execute() 方法執行后立即執行,運行在UI線程中, 
   * 在后臺任務開始前執行,用于標識UI界面 
   */ 
  protected void onPreExecute() { 
    super.onPreExecute(); 
    Log.i("msg","onPreExecute()..."); 
  } 
 
  /** 
   * 后臺執行耗時的任務; 
   * 
   * 方法中的 String 參數對應 AsyncTask的第一個參數; 
   * 返回的 Bitmap 對應的是AsyncTask 的第三個參數; 
   * 
   * 該方法并不運行在UI線程中,主要用于異步操作,可以調用publishProgress()方法觸發 
   * onProgressUpdate對UI進行操作; 
   * 
   */ 
  protected Bitmap doInBackground(String... params) { 
    Log.i("msg","doInBackground(String... params)..."); 
 
    try { 
 
      /* 網絡訪問方式 二 */ 
      /* 
      URL url = new URL(params[0]); 
      HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); 
      connection.connect(); // 開始連接 
      int zong = connection.getContentLength(); 
      InputStream is2 = connection.getInputStream(); 
      */ 
 
      /* 開始網絡訪問數據 */ 
      HttpGet hg = new HttpGet(params[0]); // 此處注意參數的用法 
      HttpClient hc = new DefaultHttpClient(); 
      HttpResponse hr = hc.execute(hg); // 發送請求,得到響應 
 
      // 判斷請求是否成功 
      if(hr.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ 
        Log.i("msg", "access success..."); 
        HttpEntity he = hr.getEntity(); 
        InputStream is = he.getContent(); // 獲取輸入流對象,好比搭橋 
        long total = he.getContentLength(); // 文件的總字節數 
 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 輸出流,臨時容器,用于裝從is中流出的數據 
 
        byte[] buffer = new byte[1024]; // 緩存容器,每次裝載1024 個字節數據 
        int len = 0; // 每次讀的字節數 
        int curLen = 0 ; // 已讀多少數據 
 
        while((len=is.read(buffer))!=-1){ // 當len !=-1 時,也就是還有數據可讀 
          Log.i("msg","begin read data..."+len+",total:"+total); 
          baos.write(buffer, 0, len); // 向臨時容器中裝數據 
          curLen=curLen+len; // 更新已讀的數據 
 
          /* 在UI顯示當前讀取的進度 , 調用次方法觸發onProgressUpdate() 方法執行 */ 
          publishProgress((int)(((float)curLen/total)*100)); 
        } 
 
        Bitmap bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, (int)total); 
        is.close(); 
        return bitmap; 
      } 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
 
    return null; 
  } 
 
  /** 
   * 括號中的參數:String 對應的是AsyncTask 的第三個參數,也就是 
   * 接收了 從doInBackground() 返回的結果; 
   * 此方法在 doInBackground() 方法執行結束后執行,運行在UI線程中, 
   * 可以對UI進行更新 
   */ 
  protected void onPostExecute(Bitmap result) { 
    super.onPostExecute(result); 
    Log.i("msg","onPostExecute(String result)..."+result.getHeight()); 
  } 
 
 
  /** 
   * 方法括號中的Integer 對應AsyncTask 中的第二個參數; 
   * 在doInBackground() 中每次調用publishProgress() 時被執行; 
   * 該方法是在UI線程中的,所以可以用于對UI進行更新 
   */ 
  protected void onProgressUpdate(Integer... values) { 
    super.onProgressUpdate(values); 
 
    Log.i("msg","onProgressUpdate(Integer... values)..."+values[0]); 
  } 
 
 
  /** 
   * 圖片的下載 
   */ 
  public HttpURLConnection downPic(String urltemp){ 
 
    try { 
      URL url = new URL(urltemp); // 確定連接地址 
      // 打開一個連接 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); // 開始連接 
      return connection; 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    return null; 
  } 
 
 
 
}

看完上述內容,你們對Android中AsyncTask如何使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

承德县| 罗甸县| 原阳县| 额敏县| 墨竹工卡县| 游戏| 万州区| 鹤壁市| 新源县| 兖州市| 四会市| 北碚区| 辰溪县| 军事| 保靖县| 巴南区| 娱乐| 西乌| 偏关县| 依安县| 浑源县| 双辽市| 手机| 渭源县| 布拖县| 屯昌县| 西乡县| 昭平县| 平陆县| 军事| 奉节县| 巨野县| 阳城县| 湘潭市| 新乐市| 惠东县| 房产| 日照市| 囊谦县| 大安市| 临湘市|