如何从应用程序类中提升界面?

时间:2011-05-16 09:16:30

标签: android interface

朋友,

我从应用程序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 :(得分:0)

您可以使用observer pattern来实现此行为。

活动B将实现IBanksLoader(观察者)接口并将其自身注册到某个中心组件。当AsyncTask完成时,必须通知此中央组件,然后调用所有已注册观察者的OnBankLoadingComplete()(相当于Observer接口的notify())。

我建议使用SingletonApplication类作为中心组件,因为它们可以在应用程序的任何位置轻松访问,也可以从AsyncTask访问。

但要注意应用程序的生命周期。因此,您可能需要在某个时间取消注册活动B,例如在它被摧毁之前。否则,中心组件将在一个null的对象上调用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();
    }
    ...    
}