2012-03-14 3 views
0

У меня есть два AsyncTasks в моей деятельности, которые используют различные типы аргументов: каждыйКастинг AsyncTask в Android

private class TaskA extends AsyncTask<Void, byte[], Boolean> { ... } 
private class TaskB extends AsyncTask<byte[], byte[], Boolean> 

Оба суб-классы реализации методы public boolean SendDataToNetwork(final byte[] cmd), который может быть вызван из графического интерфейса потока.

Я хотел бы иметь ссылку в моей деятельности, которая указывает либо TaskA, либо TaskB в зависимости от того, какие аргументы передаются моей деятельности с намерением.

То, что я действительно пытался до сих пор:

private AsyncTask<?, ?, ?> myTask = null; 

и

switch(mode) { 
    case 1: 
     myTask = new TaskA(); 
     break; 
    case 0: 
     myTask = new TaskB(); 
     break; 
    } 

Однако, когда я пытаюсь выполнить myTask позже в коде с

myTask.execute(); 

это приводит к ошибка компиляции: Type safety: A generic array of capture#7-of ? is created for a varargs parameter

Как я могу правильно наложить myTask на TaskA или TaskB в соответствии с заключением оператора switch-case?

Update:

Initializing myTask с:

private AsyncTask myTask = null; 

доходность к одно предупреждение:

myTask= new TaskA(); 
myTask.execute(); 

The method execute(Object...) belongs to the raw type AsyncTask. References to generic type AsyncTask<Params,Progress,Result> should be parameterized 

Если я пытаюсь использовать метод SendDataToNetwork я получаю сообщение об ошибке Сейчас:

The method SendDataToNetwork(byte[]) is undefined for the type AsyncTask 

Похоже, что объект myTask никогда не отливается к типу TaskA или TaskB?

+0

Вам нужно показать нам больше кода. Предупреждение указывает, что вы используете метод с параметром varargs. Вы должны это показать. – newacct

+0

Не используйте общий синтаксис define myTask, то есть private AsyncTask myTask = null; – yorkw

+0

См. Обновленный код выше. – Flo

ответ

1

Если вы рассчитываете на возможность вызова SendDataToNetwork для обоих типов задач, возможно, ваши подклассы AsyncTask должны реализовать интерфейс, который его объявляет.

+0

Проблема заключается в том, что родительский класс 'AsyncTask' не имеет метода' SendDataToNetwork', и я объявляю 'myTask' как' AsyncTask' – Flo

+0

Вы можете расширить AsyncTask и реализовать интерфейс в одно и то же время. –