2013-03-12 4 views
0

Я создал класс, расширяющийся Asynctask. Этот класс вызывается из нескольких видов деятельности. Он получает некоторые данные с веб-страницы. После этого, в зависимости от URL-адреса, данные обрабатываются в методе onPostExecute. Прямо сейчас, используя несколько операторов else if, но это немного неудобно.определить onPostExecute, когда новая Asynctask называется

Есть ли способ определить способ onPostExecute в Управлении, который создает новый Asynctask.

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

ответ

4

Вы регистрируете прослушиватель событий для AsyncTask, который он вызывается при запуске onPostExecute.

public class Example extends AsyncTask<Void, Void, Void> { 

    public interface ExampleListener { 
    public void onStart(); 
    public void onProgress(); 
    public void onFinish(); 
    } 

    private ExampleListener listener; 

    public Example(ExampleListener listener) { 
    mListener = listener; 
    } 

    @Override 
    public void onPreExecute() { 
    ... 
    mListener.onStart(); 
    ... 
    } 

    @Override 
    public void onProgressUpdate(Void... v) { 
    ... 
    mListener.onProgress(); 
    ... 
    } 

    @Override 
    public void onPostExecute(Void result) { 
    ... 
    mListener.onFinish(); 
    ... 
    } 
} 

Настройте образец, чтобы он соответствовал любому дизайну. Включите любые параметры в методы интерфейса, которые должен иметь слушатель для каждого события. Если у вас есть класс, который реализует Example.ExampleListener, вам нужно только запустить его, вызвав new Example(this).execute().

+0

Я пробовал это, но получаю nullpointerexception при вызове listener.onFinish(). но я инициализировал слушателя в конструкторе – Cheetah

+0

Вы получаете исключение nullPointerException в методе 'onFinish()' или когда вы вызываете 'onFinish()'? – DeeV

+0

когда я вызываю onFinish(). похоже слушатель равняется нулю – Cheetah

6

Вы можете сделать это без дополнительной работы.

public class MyTask extends AsyncTask<Void, Void, Void> 
{ 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     // do some work 
     return null; 
    } 

} 

И в деятельности:

MyTask t = new MyTask() 
    { 
     @Override 
     protected void onPostExecute(Void result) 
     { 
      super.onPostExecute(result); 
      // do some work    
     } 
    }; 
0

Другой способ, более Java/родовое, что может помочь улучшить ваш код будет использовать Strategy шаблон. Короче говоря, для каждой различной обработки данных вы создадите другой класс, реализующий один и тот же интерфейс. Таким образом, добавление новых «стратегий» потребует новых классов, поэтому ваш код будет ясен.
Пример:

public void onPostExecute(String result){ 
ResponParser responseParser; 

if (result.equals("http://..1")); 
responseParser = new ResponParser1(); 
else if (result.equals("http://..2")); 
responseParser = new ResponParser1(); 

responseParser.parse(); 
} 

, где ResponParser представляет собой интерфейс, реализованный как ResponParser1 и ResponParser1, которые являются конкретными классами.

-1

Использование интерфейса - лучший вариант, но для простоты вы также можете передать Runnable to AsyncTask, который вы можете выполнить в методе onPostExecute().

Смежные вопросы