【Android 异步操作】AsyncTask 异步任务 ( FutureTask 模拟 AsyncTask 执行过程 | AsyncTask 执行过程回顾 | FutureTask 分析 )
文章目錄
- 一、FutureTask 使用流程
- 二、FutureTask 模擬 AsyncTask 執行過程
- 三、AsyncTask 執行過程回顧
- 四、FutureTask 分析
一、FutureTask 使用流程
FutureTask 使用流程 :
① 自定義 Callable 類型 : 實現 Callable<String> 接口 , 實現 call() 方法 , 返回值 String 類型 ;
② 創建 FutureTask 對象 : new FutureTask<String>(new MyCallable()) , 其返回值是 String 類型 , 傳入 MyCallable 對象 ;
③ 創建線程池 : 調用 Executors.newCachedThreadPool() 創建線程池 ;
④ 執行 FutureTask 任務 : 調用線程池 executorService.execute(futureTask) 執行 FutureTask 任務 ;
二、FutureTask 模擬 AsyncTask 執行過程
1 . FutureTask 任務 : 普通的線程執行是無法獲取到執行結果的 , FutureTask 間接實現了 Runnable 和 Future 接口 , 可以得到子線程耗時操作的執行結果 , AsyncTask 異步任務就是使用了該機制 ;
2 . 執行完畢自動回調方法 : FutureTask<String> 的 done() 方法 , 是在 在 MyCallable 的 call() 方法執行完畢后 , 自動回調的方法 ;
3 . 獲取執行結果 :
① 獲取執行結果 : 在 FutureTask<String> 類中 , 調用 get() 方法 , 可以獲取 MyCallable 的 call 方法耗時操作的結果 , 獲取的值的類型是 FutureTask<String> 的泛型類型 String 類型 ;
② 非阻塞獲取執行結果 : 注意 FutureTask 對象的 get() 最好在 done 中調用 , 可以 立刻得到異步操作的執行結果 ;
③ 阻塞獲取執行結果 : 如果調用 get() 方法時 , Callable 的 call() 方法還沒有執行完畢 , 此時調用線程就會一直阻塞 , 直到 call() 方法是調用完畢 , 返回執行結果 , 此時才會解除阻塞 , 返回執行結果 ;
4 . 代碼示例 :
package kim.hsl.aa;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.util.Log;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask;public class MainActivity extends AppCompatActivity {public static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 手寫 AsyncTaskfuture();}private void future(){/*FutureTask 間接實現了 Runnable 和 Future 接口 ,可以得到子線程耗時操作的執行結果 , AsyncTask 異步任務就是使用了該機制 ;需要開發者傳入 Callable 或者 Runnable 實現類對象 , 在該對象中定義要在子線程中執行的操作*/FutureTask<String> futureTask = new FutureTask<String>(new MyCallable()){/*** 該方法在 MyCallable 的 call() 方法執行完畢后* 自動回調*/@Overrideprotected void done() {try {/*獲取 MyCallable 的 call 方法耗時操作的結果注意 FutureTask 對象的 get() 最好在 done 中調用 , 可以立刻得到異步操作的執行結果如果調用 get() 方法時 , Callable 的 call() 方法還沒有執行完畢 ,此時調用線程就會一直阻塞 , 直到 call() 方法是調用完畢 ,返回執行結果 , 此時才會解除阻塞 , 返回執行結果 ;*/String callableResult = get();Log.i(TAG, "執行結果 : " + callableResult);} catch (ExecutionException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}};// 創建線程池 , 通過該線程池執行ExecutorService executorService = Executors.newCachedThreadPool();// 執行 futureTask 耗時操作executorService.execute(futureTask);}/*** 自定義 Callable 類型* 實際的異步操作在該方法中執行*/class MyCallable implements Callable<String>{@Overridepublic String call() throws Exception {Log.i(TAG, "MyCallable call() 耗時操作");return "Success";}}}5 . 執行結果 :
2020-07-10 20:15:30.724 4325-4461/kim.hsl.aa I/MainActivity: MyCallable call() 耗時操作 2020-07-10 20:15:30.724 4325-4461/kim.hsl.aa I/MainActivity: 執行結果 : Success三、AsyncTask 執行過程回顧
AsyncTask 異步任務執行流程 :
① 構造函數中 :
-
創建 Callable 任務 : 創建 WorkerRunnable , 這是 Callable 接口的抽象類 ;
-
創建了 FutureTask 任務 : 該任務線程執行可以 返回線程執行結果 ;
上述 WorkerRunnable 對象 , 就是 傳遞給 FutureTask 的參數 , 與實際的后臺任務方法 doInBackground() 就是執行的 WorkerRunnable 的 call() 方法 ;
② 執行異步任務 : 使用 SerialExecutor 自定義的串行線程池 , 調用 SerialExecutor 對象的 execute 方法 , 執行 FutureTask 任務 ;
四、FutureTask 分析
FutureTask<V> 是一個可取消的異步運算 ; 該類提供了一個 Future 實現 , 包含了如下方法 :
- 開始計算的過程
- 取消計算過程
- 檢查計算是否完成
- 獲取計算結果
計算結果只能在計算完畢之后獲取 ; 如果計算沒有完成 , 計算方法將會阻塞 ;
計算過程是一次性的 , 計算已經完成后 , 無法重新開始或取消 , 除非調用重置方法
該類實現了 RunnableFuture 接口 ;
/*** 一個可取消的異步計算 ; * 該類提供了一個 Future 實現 , 包含了如下方法 : * - 1. 開始計算的過程 * - 2. 取消計算過程 * - 3. 檢查計算是否完成* - 4. 獲取計算記過 * 計算結果只能在計算完畢之后獲取 ; * 如果計算沒有完成 , 計算方法將會阻塞 ; * 計算過程是一次性的 , 計算已經完成后 , 無法重新開始或取消 , 除非調用重置方法*/ public class FutureTask<V> implements RunnableFuture<V> { }RunnableFuture 接口說明 : 既是 Future , 又是 Runnable ; 執行 run 方法后 , Future 也同時完成 , 并且允許查詢執行結果 ;
/*** 既是 Future , 又是 Runnable ; * 執行 run 方法后 , Future 也同時完成 , 允許查詢執行結果 ; * * @param <V> 返回結果 , V 泛型類型*/ public interface RunnableFuture<V> extends Runnable, Future<V> {/*** 為計算的執行結果設置這個 Future , 除非該任務被取消 ; */void run(); }總結
以上是生活随笔為你收集整理的【Android 异步操作】AsyncTask 异步任务 ( FutureTask 模拟 AsyncTask 执行过程 | AsyncTask 执行过程回顾 | FutureTask 分析 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 异步操作】AsyncT
- 下一篇: 【Android 异步操作】Future