2

これが可能かどうか、またはこれを正しく考えているかどうかはわかりません。

ビットマップを効率的に表示するためのAndroid開発者トレーニングでは、のカスタムバージョンをAsyncTask使用して、以下のAndroidバージョンと互換性のあるコードを作成しますHONEYCOMB

この素晴らしい答えAsyncTaskは、前と後の操作の違いを説明していHONEYCOMBます。ガイドでカスタムバージョンが提供されている理由は、画像のをすばやくスクロールすると、pre HONEYCOMB(タスクのプール)のデフォルトが非常に簡単にクラッシュするためjava.util.concurrent.RejectedExecutionExceptionです。GridViewこのシナリオでは、デフォルトのポストHONEYCOMBバージョン(追加スレッドでのシリアル実行)が必要です。

プロジェクトで新しいバージョンを使用することでこれを簡単に行うことができますAsyncTask(開発者トレーニングの例で行われたように)が、これは将来の変更とあまり互換性がありません。

私がやりたいことは次のとおりです。

バージョンがHONEYCOMBそれ以上の 場合AsyncTaskは、フレームワークで提供されているの実装を使用しますが、それ以前の場合はAsyncTask、アプリケーションで提供されている実装を使用します。

これは可能ですか(そしてどのように)、それとも私はそれについて別の方法で考える必要がありますか?

編集: 実行に基づいて条件を提供する方法を理解していSDK_VERSIONます。

私が抱えている問題AsyncTaskは、抽象クラスであるということです。つまり、実装を提供する必要があります。たとえば、私は以下のように拡張するAsyncTask呼び出しを持っています:myTaskAsyncTask

public class myTask extends AsyncTask<Void, Void, Void> {
    // Implementations for the abstract functions (doInBackground)
}

AsyncTaskのどのバージョンが拡張されているかをどのように判断しますか?

4

2 に答える 2

2

あなたは次のようなことをすることができます:

if(android.os.Build.VERSION.SDK_INT >= 11){ // Honeycomb
{
  AsyncTask taskObj = new DefaultAsyncTaskImpl();
  taskObj.execute();  
} else {
  AsyncTask taskObj = new CustomAsyncTaskImpl();
  taskObj.execute();
}

そして、コードで、最初のクラスが拡張AsyncTaskされ、2番目のクラスが独自の実装である両方のクラスを定義します

注:SDK_INTAPI4以降で利用可能

編集:

factory design patternSDKのバージョンに基づいて作成するオブジェクトを決定するために使用できます。

于 2013-03-15T02:48:07.923 に答える
1
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // Use built in AysncTask
        } else {
            // Use your AsyncTask
        }

OSのバージョンを確認する必要があります

于 2013-03-15T02:48:50.030 に答える