回调其他类的活动
我有Activity
类,Controller
类(正常的java类用来控制活动的数量)和BusinessEngine
类(正常的java类用于处理数据)。回调其他类的活动
当我需要做的活动有一定的计算,Activity
将调用Controller
和Controller
将调用BusinessEngine
做计算。当BusinessEngine
完成计算后,它会将值传递回Controller
,最后让活动知道计算已完成。
问题是我如何从Controller
类回调Activity
?或者将任何数据传递给Activity
并通知它数据已更改?
你为什么要找控制器来打电话给你Activity?通常情况下,你必须活动通过它的方法调用控制器,并从中直接得到的结果:使用的是Android的AsyncTask
// Code in your Activity
result = controller.doSomething(args);
将您的类添加到异步任务中,或者如果您调用类并将它们从一个类传递到另一个类。我会说使用静态类。并提供一些代码,以便我们知道如何传递数据。
如果不使用通用方法来调用超类或子类。
我的答案有点抽象,因为信息较少。
任何“长”运行任务必须在后台线程中执行。我不确定你现在是否正在为你的任务做这件事,所以如果你不是,那么有几种方法可以做到这一点。第一种方法是简单地使用AsyncTask,第二种方法是创建自己的AbstractExecutorService(AsyncTask使用ThreadPoolExecutor)的实例并使用它将Runnable或Callables发布到。后面的方法可能会为您节省很多重置因素,具体取决于您的代码库。
假设您现在在后台线程中运行任务,有必要在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的,而不是活动),但希望它应该有足够的了解你需要什么做:)
如果按照你的建议,那么我的活动将冻结,直到doSomething完成,即使我把一个线程doSomething;那么我不会知道什么时候结果可用,因为我没有回叫来通知我它已准备好使用。 –
如果你的方法需要花费很多时间来执行,那么你可以在你的Activity中使用AsyncTask来完成这项工作:http://developer.android.com/reference/android/os/AsyncTask.html – Hicham