Обратный звонок в активность из другого класса - PullRequest
1 голос
/ 24 ноября 2011

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

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

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

Ответы [ 4 ]

1 голос
/ 24 ноября 2011

Любые "длинные" задачи должны выполняться в фоновом потоке.Я не уверен, что вы сейчас делаете это для вашей задачи, так что на случай, если нет, есть несколько способов сделать это.Первый - просто использовать AsyncTask , второй - создать собственный экземпляр AbstractExecutorService (AsyncTask использует ThreadPoolExecutor ) и использовать его для публикации Runnable или Callables до.Более поздний способ может сэкономить вам много факторинга в зависимости от вашей кодовой базы.

Предполагая, что вы сейчас запускаете задачу в фоновом потоке, необходимо выполнить обновления вашего пользовательского интерфейса в потоке пользовательского интерфейса.Есть снова несколько способов сделать это.Один из методов заключается в публикации исполняемого файла для метода Activity # runOnUiThread , второй - для использования Handler , который ранее был создан в потоке пользовательского интерфейса (который Activity # runOnUiThread делает засцены).

Итак, предположим, что ваша активность имеет метод #postResults (конечный объект 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), но, надеюсь, это должно бытьдостаточно чтобы понять что нужно делать :) 1027 *

0 голосов
/ 24 ноября 2011

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

0 голосов
/ 24 ноября 2011

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

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

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

0 голосов
/ 24 ноября 2011

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

// Code in your Activity
result = controller.doSomething(args);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...