как поднять интерфейс из класса приложения?

1

друзья

Я запускаю async-задачу из приложения 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
    Что вы подразумеваете под «поднять интерфейс»?
Теги:
interface

1 ответ

0
Лучший ответ

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

Действие B реализует интерфейс IBanksLoader (наблюдателя) и регистрируется на каком-то центральном компоненте. Этот центральный компонент должен быть уведомлен о завершении работы AsyncTask и затем вызывает OnBankLoadingComplete() (эквивалентно уведомлению() интерфейса 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();
    }
    ...    
}
  • 0
    Не могли бы вы предоставить пример кода? или короткая идея, псевдокод, как вещь, это довольно сложно понять для меня.
  • 0
    Я обновил свой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню