2 votes

Choisir entre différentes implémentations d'une même classe

Je ne sais pas si cela est possible ou si je pense correctement.

Dans la formation de développeur Android pour Affichage efficace des bitmaps une version personnalisée de la AsyncTask est utilisé pour rendre le code compatible avec les versions d'Android inférieures à la norme. HONEYCOMB .

Ce grand réponse explique les différences entre AsyncTask opération en pré et post HONEYCOMB . La raison pour laquelle une version personnalisée est fournie dans le guide est que la version par défaut dans le système pré HONEYCOMB (un pool de tâches) se plantera très facilement avec un java.util.concurrent.RejectedExecutionException si le GridView d'images défilent rapidement. Pour ce scénario, le post par défaut HONEYCOMB (exécution en série sur un thread supplémentaire) est ce qui est requis.

Je pourrais facilement faire cela en utilisant une version plus récente de AsyncTask dans mon projet (comme dans l'exemple de la formation de développeur) mais cela n'est pas très compatible avec les changements futurs.

Ce que je voudrais faire est le suivant :

Si la version est HONEYCOMB ou plus, utilisez l'implémentation de AsyncTask fourni dans le cadre, alors que s'il est antérieur, utilisez le site AsyncTask fournie dans mon application.

Est-ce possible (et comment) ou dois-je envisager les choses différemment ?

EDIT : Je comprends comment fournir des conditionnelles basées sur l'exécution. SDK_VERSION .

Le problème que j'ai est que AsyncTask est une classe abstraite, ce qui signifie que je dois fournir une implémentation. Par exemple, j'ai un AsyncTask appelé myTask qui prolonge AsyncTask comme ci-dessous :

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

Comment puis-je décider quelle version du AsyncTask est prolongé ?

2voto

iTech Points 7948

Vous pouvez faire quelque chose comme :

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

Et dans votre code, définissez deux classes dans lesquelles la première étend AsyncTask et le second est votre propre implémentation

Note : SDK_INT Disponible dans l'API 4+.

Edita:

Vous pouvez utiliser factory design pattern pour décider de l'objet à créer en fonction de la version du SDK.

1voto

MoshErsan Points 5119
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // Use built in AysncTask
        } else {
            // Use your AsyncTask
        }

vous devez vérifier la version du système d'exploitation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X