2011-11-24 64 views
1

我有Activity类,Controller类(正常的java类用来控制活动的数量)和BusinessEngine类(正常的java类用于处理数据)。回调其他类的活动

当我需要做的活动有一定的计算,Activity将调用ControllerController将调用BusinessEngine做计算。当BusinessEngine完成计算后,它会将值传递回Controller,最后让活动知道计算已完成。

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

回答

0

你为什么要找控制器来打电话给你Activity?通常情况下,你必须活动通过它的方法调用控制器,并从中直接得到的结果:使用的是Android的AsyncTask

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

如果按照你的建议,那么我的活动将冻结,直到doSomething完成,即使我把一个线程doSomething;那么我不会知道什么时候结果可用,因为我没有回叫来通知我它已准备好使用。 –

+0

如果你的方法需要花费很多时间来执行,那么你可以在你的Activity中使用AsyncTask来完成这项工作:http://developer.android.com/reference/android/os/AsyncTask.html – Hicham

0

试试,如果你的方法需要很长的时间来处理。 example

0

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

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

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

1

任何“长”运行任务必须在后台线程中执行。我不确定你现在是否正在为你的任务做这件事,所以如果你不是,那么有几种方法可以做到这一点。第一种方法是简单地使用AsyncTask,第二种方法是创建自己的AbstractExecutorService(AsyncTask使用ThreadPoolExecutor)的实例并使用它将RunnableCallables发布到。后面的方法可能会为您节省很多重置因素,具体取决于您的代码库。

假设您现在在后台线程中运行任务,有必要在UI线程上执行UI更新。还有几种方法可以做到这一点。一种方法是将方法发布到方法Activity#runOnUiThread,第二种方法是使用之前已在UI线程上创建的Handler(Activity#runOnUiThread在后台执行)。所以,假设你的Activity有一个方法#postResults(final Object o),并且你的控制器有方法#doSomething(final Activity activity)。

你的活动看起来像这样。

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的,而不是活动),但希望它应该有足够的了解你需要什么做:)