У меня есть класс Activity, класс Controller (обычное использование класса java для управления количеством действий) и класс BusinessEngine (обычное использование класса java для обработки данных).

Когда мне нужно выполнить некоторые вычисления из действия, Activity вызовет Controller, а Controller вызовет BusinessEngine для выполнения вычислений. Когда BusinessEngine завершит расчет, он передаст значение обратно Controller и, наконец, сообщит активности, что расчет завершен.

Проблема в том, как я вызываю Activity из класса Controller? Или передать какие-либо данные в Activity и уведомить его об изменении данных?

1
Too Hon Wai 24 Ноя 2011 в 06:47

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), но, надеюсь, этого должно быть достаточно, чтобы понять, что вам нужно делать :)

1
Kingamajick 24 Ноя 2011 в 21:18

Почему вы ищете, чтобы контроллер назвал вас Activity? Обычно ваша активность должна вызывать контроллер через его методы и напрямую получать от них результаты:

// Code in your Activity
result = controller.doSomething(args);
0
Hicham 24 Ноя 2011 в 07:30
Если вы сделаете так, как вы предлагаете, моя активность зависнет до тех пор, пока doSomething не будет завершен, даже если я поставлю поток на doSomething; тогда я не буду знать, когда результат можно будет использовать, поскольку у меня нет обратного вызова, чтобы уведомить меня о том, что он готов к использованию.
 – 
Too Hon Wai
24 Ноя 2011 в 07:44
Если для выполнения вашего метода требуется много времени, вы можете использовать AsyncTask в своей деятельности для выполнения задания: developer.android.com/reference/android/os/AsyncTask.html
 – 
Hicham
24 Ноя 2011 в 07:46

Попробуйте использовать AsyncTask для Android, если обработка вашего метода занимает много времени. пример

0
Rakhita 24 Ноя 2011 в 09:48

Добавьте свои классы в асинхронную задачу или если вы вызываете классы и передаете их из одного класса в другой. Я бы сказал, чтобы использовать статический класс. И предоставьте некоторый код, чтобы мы могли знать, как вы передаете свои данные.

Если не использовать общие методы для вызова суперкласса или подкласса.

Мой ответ немного абстрактен, так как информации меньше.

0
Vinoth 24 Ноя 2011 в 09:52