上面這樣用Handler來做的時候,后來發現,程序運行的過程中,由于線程的問題,出現了一些問題,比如
操作過程中有可能會崩潰等.
安卓原生系統設置apk?? ? 用AsyncTask執行,異步操作可能會好一些.android原生提供,執行以后可以通知UI線程更新UI
通過AsyncTask可以實現
UI
線程)之間的通信,即:將工作線程的執行結果傳遞給主線程,從而在主線程中執行相關的UI
操作,從而保證線程安全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();
?
AsyncTask
子類的實例對象(即 任務實例)execute(()
從而執行異步線程任務android studio release、3.上面是介紹,然后我們再去寫個例子去看看:
下面,我將用1個實例講解 具體如何使用 AsyncTask
如下圖
Android Studio Plugins、
?
示意圖
Android 編譯,建議先下載源碼再看:Carson_Ho的Github地址:AsyncTask
?
<?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>
?
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);}});}}
?
示意圖
鏈接:https://www.jianshu.com/p/ee1342fcf5e7
?
AsyncTaskLoader 這個沒有說,這個也是實現的TsyncTask,相當于又封裝了一層,用到的時候,
再去看也可以。
技術交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 CSDN賬號:credreamer 開通了個人技術微信公眾號:credream,有需要的朋友可以添加相互學習
?
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态