У меня есть класс Activity
, класс Controller
(обычное использование класса java для управления количеством действий) и класс BusinessEngine
(обычное использование класса java для обработки данных).
Когда мне нужно выполнить некоторые вычисления из действия, Activity
вызовет Controller
, а Controller
вызовет BusinessEngine
для выполнения вычислений. Когда BusinessEngine
завершит расчет, он передаст значение обратно Controller
и, наконец, сообщит активности, что расчет завершен.
Проблема в том, как я вызываю Activity
из класса Controller
? Или передать какие-либо данные в Activity
и уведомить его об изменении данных?
4 ответа
Любые «долгоиграющие» задачи должны выполняться в фоновом потоке. Я не уверен, что вы сейчас делаете это для своей задачи, поэтому на всякий случай есть несколько способов сделать это. Первый — просто использовать AsyncTask, второй — создать свой собственный экземпляр AbstractExecutorService (AsyncTask использует ThreadPoolExecutor) и используйте его для публикации Runnable или Вызовы для. Последний способ может сэкономить вам много рефакторинга в зависимости от вашей кодовой базы.
Предполагая, что вы сейчас выполняете задачу в фоновом потоке, необходимо выполнять обновления пользовательского интерфейса в потоке пользовательского интерфейса. Есть еще несколько способов сделать это. Один из способов — отправить исполняемый файл в метод Activity#runOnUiThread, второй — использовать обработчик который ранее был создан в потоке пользовательского интерфейса (что делает 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, а не для Activity), но, надеюсь, этого должно быть достаточно, чтобы понять, что вам нужно делать :)
Почему вы ищете, чтобы контроллер назвал вас Activity? Обычно ваша активность должна вызывать контроллер через его методы и напрямую получать от них результаты:
// Code in your Activity
result = controller.doSomething(args);
Попробуйте использовать AsyncTask для Android, если обработка вашего метода занимает много времени. пример
Добавьте свои классы в асинхронную задачу или если вы вызываете классы и передаете их из одного класса в другой. Я бы сказал, чтобы использовать статический класс. И предоставьте некоторый код, чтобы мы могли знать, как вы передаете свои данные.
Если не использовать общие методы для вызова суперкласса или подкласса.
Мой ответ немного абстрактен, так как информации меньше.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.