Любые "длинные" задачи должны выполняться в фоновом потоке.Я не уверен, что вы сейчас делаете это для вашей задачи, так что на случай, если нет, есть несколько способов сделать это.Первый - просто использовать 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 *