ホームページ >Java >&#&チュートリアル >Android 11 の AsyncTask の適切な代替品は何ですか?また、minSdkVersion 16 を対象として、既存の AsyncTask コードを移行して使用するにはどうすればよいですか?

Android 11 の AsyncTask の適切な代替品は何ですか?また、minSdkVersion 16 を対象として、既存の AsyncTask コードを移行して使用するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-15 07:18:14216ブラウズ

What are the suitable replacements for AsyncTask in Android 11 and how can I migrate my existing AsyncTask code to use them, targeting minSdkVersion 16?

AsyncTask API は Android 11 で非推奨になりました: 代替手段は何ですか?

Google は、Android 11 で Android AsyncTask API を廃止し、代わりに java.util.concurrent を使用することを推奨すると発表しました。ここでコミット情報を確認できます:

 * @deprecated Use the standard <code>java.util.concurrent</code> or
 *   <a href=&quot;https://developer.android.com/topic/libraries/architecture/coroutines&quot;>
 *   Kotlin concurrency utilities</a> instead.
 */
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {

Android で非同期タスクを使用する古いコードベースを維持している場合は、将来的にコードベースを変更する必要がある可能性があります。私の質問は、以下に示すコード スニペットを java.util.concurrent に適切に置き換えるにはどうすればよいかということです。これは、Activity の静的な内部クラスです。 minSdkVersion 16 で動作するソリューションを探しています。

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) ;
        }     


    }

代替:

java.util.concurrent パッケージの Executor を直接使用できます。

また、オンラインで情報を検索し、次の記事で解決策を見つけました: Android Async API は非推奨です。

残念ながらこの記事は 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
    });
});

それでも、コードの簡潔さという点では kotlin に勝るものはありませんが、以前の Java バージョンよりは優れています。

これがお役に立てば幸いです。ありがとうございます!

以上がAndroid 11 の AsyncTask の適切な代替品は何ですか?また、minSdkVersion 16 を対象として、既存の AsyncTask コードを移行して使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。