我有Activity
类,Controller
类(用于控制活动数量的普通java类)和BusinessEngine
类(用于处理数据的普通java类)。
如果我需要根据活动进行一些计算,Activity
会致电Controller
而Controller
会致电BusinessEngine
进行计算。当BusinessEngine
完成计算后,它会将值传递回Controller
,最后让活动知道计算已完成。
问题是我如何从Activity
课程回调Controller
?或者将任何数据传递给Activity
并通知它数据已被更改?
答案 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任务,或者如果您正在调用类并将它们从一个类传递给另一个类。我会说要使用静态类。并提供一些代码,以便我们知道您如何传递数据。
如果不使用通用方法来调用超类或子类。
我的回答有点抽象,因为信息较少。