как поднять интерфейс из класса приложения? - PullRequest
1 голос
/ 16 мая 2011

друзья,

я запускаю асинхронную задачу из приложения onCreate ()

теперь я хочу вызвать интерфейс по завершении этой задачи и реализовать его в ACtivity B.

кто-нибудь подскажет, как этого добиться?

мой интерфейс

public interface IBanksLoader 
{
    public void OnBankLoadingComplete(boolean complete);
}

в классе приложений

AsyncTask
{

any other function();
// to raise it here
}


Activity b
{

// implement it here to get result.
}

любая помощь будет оценена.

1 Ответ

0 голосов
/ 16 мая 2011

Вы можете использовать шаблон наблюдателя для реализации этого поведения.

Операция B реализует интерфейс IBanksLoader (наблюдатель) и регистрируется в некотором центральном компоненте.Этот центральный компонент должен получить уведомление о завершении AsyncTask и затем вызвать OnBankLoadingComplete () (эквивалентно notify () интерфейса Observer) всех зарегистрированных наблюдателей.

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

Но помните о жизненном цикле вашего приложения.Таким образом, вам может потребоваться отменить регистрацию действия B в какое-то время, например, до того, как оно будет уничтожено.В противном случае центральный компонент вызовет OnBankLoadingComplete () для объекта, который является нулевым, и, таким образом, вызовет исключение NullPointerException.

ОБНОВЛЕНИЕ

public class ActivityB extends Activity implements IBanksLoader {

    public void onCreate(){           
        ...

        MyApplication app = (MyApplication) getApplication();
        app.register(this);

        ...
    }

    public void OnBankLoadingComplete(boolean complete){

         // your code here ...
    }

    public void onDestroy(){
        MyApplication app = (MyApplication) getApplication();
        app.unregister(this);
    }
}


public class MyApplication extends Application{

    private List<IBanksLoader> observers = new ArrayList<IBanksLoader>();

    public void register(IBanksLoader observer){
        if(observer != null){
            oberservers.add(observer);
        }
    }

    public void unregister(IBanksLoader observer){
        if(observer != null){
            oberservers.remove(observer);
        }
    }

    public void taskfinished(){
        foreach(IBanksLoader bank : observers){
            if(bank != null){
                bank.OnBankLoadingComplete(true);
            }
        }
    }
}


public class MyTask extends AsyncTask{
    ... 

    public void onPostExecute(){
        MyApplication app = (MyApplication) getApplication();
        app.taskfinished();
    }
    ...    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...