从其他类回调活动

时间:2011-11-24 02:47:03

标签: android model-view-controller android-activity callback

我有Activity类,Controller类(用于控制活动数量的普通java类)和BusinessEngine类(用于处理数据的普通java类)。

如果我需要根据活动进行一些计算,Activity会致电ControllerController会致电BusinessEngine进行计算。当BusinessEngine完成计算后,它会将值传递回Controller,最后让活动知道计算已完成。

问题是我如何从Activity课程回调Controller?或者将任何数据传递给Activity并通知它数据已被更改?

4 个答案:

答案 0 :(得分:1)

任何“长”运行任务必须在后台线程中执行。我不确定你目前是否正在为你的任务做这件事,所以万一你不这样做,有几种方法可以做到这一点。第一个是简单地使用AsyncTask,第二个是创建自己的AbstractExecutorService实例(AsyncTask使用ThreadPoolExecutor)并使用它来发布Runnable或{{3 }} 至。根据您的代码库,后面的方法可能会为您节省大量的因素。

假设您现在正在后台线程中运行任务,则必须在UI线程上执行UI更新。还有几种方法可以做到这一点。一种方法是将runnable发布到方法Callables,第二种方法是使用先前在UI线程上创建的Activity#runOnUiThread(Activity#runOnUiThread在幕后执行)。

因此,假设您的Activity有一个方法#postResults(final Object o),并且您的控制器具有方法#doSomething(最终活动活动)。

您的活动看起来像这样。

public class MyActivity extends Activity {
    Controller controller = ....
    ExecutorService service = Executors.newFixedThreadPool(10);

    private void startTask() {  
        Runnable r = new Runnable() {
            public void run() {
                c.doSomething(MyActivity.this);
            }
        }
        service.submit(r);           
    }

    public void postResults(final Object o) {
        Runnable r = new Runnable() {
            public void run() {
                // Update your UI here
            }
        }
        runOnUiThread(r)    
    }

}

和您的控制器

public class Controller {

    public void doSomething(final Activity activity) {
        // Perform some long running task here
        activity.postResults(someObject);       
    }
}

显然这个例子可以整理一下(例如将界面传递给doSomething而不是Activity),但希望它足以理解你需要做什么:)

答案 1 :(得分:0)

您为什么要找控制器给您打电话?通常,您的Activity必须通过其方法调用控制器并直接从中获取结果:

// Code in your Activity
result = controller.doSomething(args);

答案 2 :(得分:0)

尝试使用Android AsyncTask,如果您的方法需要很长时间来处理。 example

答案 3 :(得分:0)

将您的类添加到Async任务,或者如果您正在调用类并将它们从一个类传递给另一个类。我会说要使用静态类。并提供一些代码,以便我们知道您如何传递数据。

如果不使用通用方法来调用超类或子类。

我的回答有点抽象,因为信息较少。