2013-03-15 1 views
2

Я не уверен, что это возможно, или если я думаю об этом правильно.Выбирайте между различными реализациями того же класса

В обучающей программе для разработчиков Android для Displaying Bitmaps Efficiently пользовательская версия AsyncTask используется, чтобы сделать код совместимым с версиями для Android ниже HONEYCOMB.

Это отличное answer объясняет различия между операциями AsyncTask в до и после HONEYCOMB. Причина, по которой пользовательская версия указана в руководстве, заключается в том, что по умолчанию в pre HONEYCOMB (пул задач) очень легко сбой с java.util.concurrent.RejectedExecutionException, если быстро прокручиваются изображения GridView. Для этого сценария требуется сообщение по умолчанию HONEYCOMB (серийное исполнение в дополнительном потоке).

Я мог бы легко сделать это, используя более новую версию AsyncTask в своем проекте (например, в примере обучения разработчиков), но это не очень совместимо с будущими изменениями.

То, что я хотел бы сделать, это следующее:

Если версия HONEYCOMB или выше, использовать реализацию AsyncTask, представленную в рамках, в то время как если раньше, использовать в AsyncTask реализация, предусмотренная в моей заявке.

Возможно ли это (и как), или я должен думать об этом по-другому?

EDIT: Я понимаю, как обеспечить условными, основанные на управлении SDK_VERSION.

Вопрос, который у меня есть, заключается в том, что AsyncTask является абстрактным классом, что означает, что я должен обеспечить реализацию. . У меня есть AsyncTask называется myTask, который проходит AsyncTask, как показано ниже:

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

Как определить, какая версия AsyncTask распространяется?

ответ

2

Вы можете сделать что-то вроде:

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

И в вашем коде определить оба класса, в котором первый распространяется AsyncTask и вторая ваша собственная реализация

Примечание: SDK_INT доступны в API 4+

Edit:

Вы можете использовать factory design pattern, чтобы решить, какой объект создать на основе версии SDK.

+0

См редактирования.Это говорит о том, чего я боюсь, предоставляя отдельные реализации для каждого класса «AsyncTask» во всем моем приложении. Кроме того, не будет ли этот пример кода возвращать два разных объекта, поэтому весь код должен обрабатывать случаи для разных типов объектов? –

+0

* для каждого пользовательского класса 'AsyncTask' (например,' myTask') является то, что я имел в виду –

+0

. Вы можете использовать 'Factory pattern pattern', чтобы решить, какой объект создать на основе версии SDK. – iTech

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

вам нужно проверить версию ОС