Android 11 での AsyncTask API の廃止: Java 同時実行による代替手段
Android 11 が近づくにつれて、Google は AsyncTask API を段階的に廃止し、開発者にアドバイスしています非同期操作に java.util.concurrent を採用します。この変化により、API レベル 16 以降との互換性を維持しながら、AsyncTask を java.util.concurrent に効果的に置き換えるにはどうすればよいでしょうか?
アクティビティの静的内部クラスの次のスニペットを考えてみましょう:
private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> { private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName(); private WeakReference<MyActivity> activityReference; LongRunningTask(MyActivity context) { activityReference = new WeakReference<>(context); } @Override protected MyPojo doInBackground(String... params) { // Some long running task } @Override protected void onPostExecute(MyPojo data) { MyActivity activity = activityReference.get(); activity.progressBar.setVisibility(View.GONE); populateData(activity, data); } }
実行可能な解決策の 1 つは、java.util.concurrent パッケージの Executor を利用することです。 Android Async API is Deprecated の投稿にある Kotlin アプローチに基づく Java 実装を次に示します:
ExecutorService executor = Executors.newSingleThreadExecutor(); Handler handler = new Handler(Looper.getMainLooper()); executor.execute(new Runnable() { @Override public void run() { // Background work here handler.post(new Runnable() { @Override public void run() { // UI Thread work here } }); } });
Java 8 ユーザーの場合は、より簡潔なバージョンが利用可能です:
ExecutorService executor = Executors.newSingleThreadExecutor(); Handler handler = new Handler(Looper.getMainLooper()); executor.execute(() -> { // Background work here handler.post(() -> { // UI Thread work here }); });
Java は Kotlin の簡潔さに匹敵しないかもしれませんが、これらの代替案は、AsyncTask 以降の時代の非同期操作に実行可能なソリューションを提供します。 API レベル 16 デバイスとの互換性を確保します。
以上がAndroid で下位互換性を維持しながら AsyncTask を java.util.concurrent に効果的に置き換えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。