друзья
Я запускаю 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.
}
любая помощь будет оценена.
Вы можете использовать шаблон наблюдателя для реализации этого поведения.
Действие 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();
}
...
}