安卓原生系統設置apk,AndroidStudio_安卓原生開發_AsyncTask異步處理使用_AsyncTaskLoader---Android原生開發工作

 2023-10-07 阅读 22 评论 0

摘要:? ?為什么這里要說一下AsyncTask,因為之前寫程序都用Handler來做 上面這樣用Handler來做的時候,后來發現,程序運行的過程中,由于線程的問題,出現了一些問題,比如 操作過程中有可能會崩潰等. 安卓原生系統設置apk?? ? 用AsyncTask執行,異步操作可能會好一些.android原生提供,執

? ?為什么這里要說一下AsyncTask,因為之前寫程序都用Handler來做

上面這樣用Handler來做的時候,后來發現,程序運行的過程中,由于線程的問題,出現了一些問題,比如

操作過程中有可能會崩潰等.

安卓原生系統設置apk?? ? 用AsyncTask執行,異步操作可能會好一些.android原生提供,執行以后可以通知UI線程更新UI

通過AsyncTask可以實現

  1. 實現多線程
    在工作線程中執行任務,如 耗時任務
  2. 異步通信、消息傳遞
    實現工作線程 & 主線程(UI線程)之間的通信,即:將工作線程的執行結果傳遞給主線程,從而在主線程中執行相關的UI操作,從而保證線程安全
  3. 可以看看這個AsyncTask類
public abstract class AsyncTask<Params, Progress, Result> { ... 
}// 類中參數為3種泛型類型
// 整體作用:控制AsyncTask子類執行線程任務時各個階段的返回類型
// 具體說明:// a. Params:開始異步任務執行時傳入的參數類型,對應excute()中傳遞的參數// b. Progress:異步任務執行過程中,返回下載進度值的類型// c. Result:異步任務執行完成后,返回的結果類型,與doInBackground()的返回值類型保持一致
// 注:// a. 使用時并不是所有類型都被使用// b. 若無被使用,可用java.lang.Void類型代替// c. 若有不同業務,需額外再寫1個AsyncTask的子類
}

4.他有以下的方法?

原生安卓10界面、

5.然后調用順序是這樣的:

Android10?然后我們去寫一個例子看看

1.創建?AsyncTask?子類 & 根據需求實現核心方法

/*** 步驟1:創建AsyncTask子類* 注: *   a. 繼承AsyncTask類*   b. 為3個泛型參數指定類型;若不使用,可用java.lang.Void類型代替*   c. 根據需求,在AsyncTask子類內實現核心方法*/private class MyTask extends AsyncTask<Params, Progress, Result> {....// 方法1:onPreExecute()// 作用:執行 線程任務前的操作// 注:根據需求復寫@Overrideprotected void onPreExecute() {...}// 方法2:doInBackground()// 作用:接收輸入參數、執行任務中的耗時操作、返回 線程任務執行的結果// 注:必須復寫,從而自定義線程任務@Overrideprotected String doInBackground(String... params) {...// 自定義的線程任務// 可調用publishProgress()顯示進度, 之后將執行onProgressUpdate()publishProgress(count);}// 方法3:onProgressUpdate()// 作用:在主線程 顯示線程任務執行的進度// 注:根據需求復寫@Overrideprotected void onProgressUpdate(Integer... progresses) {...}// 方法4:onPostExecute()// 作用:接收線程任務執行結果、將執行結果顯示到UI組件// 注:必須復寫,從而自定義UI操作@Overrideprotected void onPostExecute(String result) {...// UI操作}// 方法5:onCancelled()// 作用:將異步任務設置為:取消狀態@Overrideprotected void onCancelled() {...}}/*** 步驟2:創建AsyncTask子類的實例對象(即 任務實例)* 注:AsyncTask子類的實例必須在UI線程中創建*/MyTask mTask = new MyTask();/*** 步驟3:手動調用execute(Params... params) 從而執行異步線程任務* 注:*    a. 必須在UI線程中調用*    b. 同一個AsyncTask實例對象只能執行1次,若執行第2次將會拋出異常*    c. 執行任務中,系統會自動調用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute() *    d. 不能手動調用上述方法*/mTask.execute();

?

  1. 創建?AsyncTask子類的實例對象(即 任務實例)
  2. 手動調用execute(()從而執行異步線程任務

android studio release、3.上面是介紹,然后我們再去寫個例子去看看:

6. 實例講解

下面,我將用1個實例講解 具體如何使用 AsyncTask

6.1 實例說明

  1. 點擊按鈕 則 開啟線程執行線程任務
  2. 顯示后臺加載進度
  3. 加載完畢后更新UI組件
  4. 期間若點擊取消按鈕,則取消加載

如下圖

Android Studio Plugins、

?

示意圖

6.2 具體實現

Android 編譯,建議先下載源碼再看:Carson_Ho的Github地址:AsyncTask

  • 主布局文件:activity_main.xml

?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns: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:gravity="center"tools:context="com.example.carson_ho.handler_learning.MainActivity"><Buttonandroid:layout_centerInParent="true"android:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="點我加載"/><TextViewandroid:id="@+id/text"android:layout_below="@+id/button"android:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="還沒開始加載!" /><ProgressBarandroid:layout_below="@+id/text"android:id="@+id/progress_bar"android:layout_width="fill_parent"android:layout_height="wrap_content"android:progress="0"android:max="100"style="?android:attr/progressBarStyleHorizontal"/><Buttonandroid:layout_below="@+id/progress_bar"android:layout_centerInParent="true"android:id="@+id/cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="cancel"/>
</RelativeLayout>
  • 主邏輯代碼文件:MainActivity.java

?

public class MainActivity extends AppCompatActivity {// 線程變量MyTask mTask;// 主布局中的UI組件Button button,cancel; // 加載、取消按鈕TextView text; // 更新的UI組件ProgressBar progressBar; // 進度條/*** 步驟1:創建AsyncTask子類* 注:*   a. 繼承AsyncTask類*   b. 為3個泛型參數指定類型;若不使用,可用java.lang.Void類型代替*      此處指定為:輸入參數 = String類型、執行進度 = Integer類型、執行結果 = String類型*   c. 根據需求,在AsyncTask子類內實現核心方法*/private class MyTask extends AsyncTask<String, Integer, String> {// 方法1:onPreExecute()// 作用:執行 線程任務前的操作@Overrideprotected void onPreExecute() {text.setText("加載中");// 執行前顯示提示}// 方法2:doInBackground()// 作用:接收輸入參數、執行任務中的耗時操作、返回 線程任務執行的結果// 此處通過計算從而模擬“加載進度”的情況@Overrideprotected String doInBackground(String... params) {try {int count = 0;int length = 1;while (count<99) {count += length;// 可調用publishProgress()顯示進度, 之后將執行onProgressUpdate()publishProgress(count);// 模擬耗時任務Thread.sleep(50);}}catch (InterruptedException e) {e.printStackTrace();}return null;}// 方法3:onProgressUpdate()// 作用:在主線程 顯示線程任務執行的進度@Overrideprotected void onProgressUpdate(Integer... progresses) {progressBar.setProgress(progresses[0]);text.setText("loading..." + progresses[0] + "%");}// 方法4:onPostExecute()// 作用:接收線程任務執行結果、將執行結果顯示到UI組件@Overrideprotected void onPostExecute(String result) {// 執行完畢后,則更新UItext.setText("加載完畢");}// 方法5:onCancelled()// 作用:將異步任務設置為:取消狀態@Overrideprotected void onCancelled() {text.setText("已取消");progressBar.setProgress(0);}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 綁定UI組件setContentView(R.layout.activity_main);button = (Button) findViewById(R.id.button);cancel = (Button) findViewById(R.id.cancel);text = (TextView) findViewById(R.id.text);progressBar = (ProgressBar) findViewById(R.id.progress_bar);/*** 步驟2:創建AsyncTask子類的實例對象(即 任務實例)* 注:AsyncTask子類的實例必須在UI線程中創建*/mTask = new MyTask();// 加載按鈕按按下時,則啟動AsyncTask// 任務完成后更新TextView的文本button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {/*** 步驟3:手動調用execute(Params... params) 從而執行異步線程任務* 注:*    a. 必須在UI線程中調用*    b. 同一個AsyncTask實例對象只能執行1次,若執行第2次將會拋出異常*    c. 執行任務中,系統會自動調用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()*    d. 不能手動調用上述方法*/mTask.execute();}});cancel = (Button) findViewById(R.id.cancel);cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 取消一個正在執行的任務,onCancelled方法將會被調用mTask.cancel(true);}});}}
  • 運行結果
  • ?

?

示意圖

  • 源碼地址
    Carson_Ho的Github地址:AsyncTask




鏈接:https://www.jianshu.com/p/ee1342fcf5e7

?

AsyncTaskLoader 這個沒有說,這個也是實現的TsyncTask,相當于又封裝了一層,用到的時候,

再去看也可以。

技術交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 CSDN賬號:credreamer 開通了個人技術微信公眾號:credream,有需要的朋友可以添加相互學習

?

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/127203.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息