Android, как группировать асинхронные задачи вместе, как в iOS

Я использую следующее, чтобы загрузить blobs и аннулировать URL-адрес объекта после загрузки. он работает в chrome и firefox!

function download(blob){
    var url = URL.createObjectURL(blob);
    console.log('create ' + url);

    window.addEventListener('focus', window_focus, false);
    function window_focus(){
        window.removeEventListener('focus', window_focus, false);                   
        URL.revokeObjectURL(url);
        console.log('revoke ' + url);
    }
    location.href = url;
}

после того, как диалоговое окно загрузки файла закрыто, окно возвращает ее фокус назад, так что событие фокусировки запускается.

23
задан fasteque 30 January 2016 в 10:50
поделиться

2 ответа

Вы можете использовать Thread s и Thread.join() с Handler s в качестве опции.

цитата из: https://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

Метод соединения позволяет Поток ждать завершения другого. Если t является объектом Thread, поток которого в данный момент выполняется,

t.join (); заставляет текущий поток приостанавливать выполнение, пока поток t не завершится. Перегрузки соединения позволяют программисту указывать период ожидания. Однако, как и в спящем режиме, объединение зависит от ОС для синхронизации, поэтому не следует предполагать, что объединение будет ждать ровно столько времени, сколько вы укажете.

Как и sleep, join реагирует на прерывание путем выхода с InterruptedException.

РЕДАКТИРОВАТЬ : Вы также должны проверить мою диспетчер событий Гист. Вам может понравиться это.

3
ответ дан Ercan 30 January 2016 в 10:50
поделиться

Я использую java.util.concurrent. CountDownLatch для достижения цели.
Прежде всего я сделал интерфейс для каждой задачи.

interface GroupTask {
    void onProcessing(final CountDownLatch latch);
}

Затем я создаю класс для обработки групповых задач.

interface MyDisptchGroupObserver {
    void onAllGroupTaskFinish();
}
class MyDisptchGroup {
    private static final int MSG_ALLTASKCOMPLETED = 300;
    private CountDownLatch latch;
    private MyDisptchGroupObserver observer;

    private MsgHandler msgHandler;
    private class MsgHandler extends Handler {
        MsgHandler(Looper looper) {
            super(looper);
        }
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
                case MSG_ALLTASKCOMPLETED:
                    observer.onAllGroupTaskFinish();
                    break;
                default:
                    break;
            }
        }
    }

    MyDisptchGroup(List<GroupTask> tasks, MyDisptchGroupObserver obj) {
        latch = new CountDownLatch(tasks.size());
        observer = obj;
        msgHandler = new MsgHandler(getActivity().getMainLooper())

        new Thread( new Runnable() {
            @Override
            public void run() {
                try {
                    latch.await();
                    Log.d(TAG, "========= All Tasks Completed =========");
                    msgHandler.sendEmptyMessage(MSG_ALLTASKCOMPLETED);
                } catch() {
                    e.printStackTrace();
                }
            }
        }).start();

        for( GroupTask task : tasks ) {
            task.onProcessing(latch);
        }
    }
}

Конечно, у меня есть более одной реализации задачи, как показано ниже. Задача1

class Task1 implements GroupTask {
    @Override
    public void onProcessing(final CountDownLatch latch) {
        new Thread( new Runnable() {
            @Override
            public void run() {
                // Just implement my task1 stuff here


                // The end of the Task1 remember to countDown
                latch.countDown();
            }
        }).start();
    }
}

И Задача2

class Task2 implements GroupTask {
    @Override
    public void onProcessing(final CountDownLatch latch) {
        new Thread( new Runnable() {
            @Override
            public void run() {
                // Just implement my task2 stuff here


                // The end of the Task2 remember to countDown
                latch.countDown();
            }
        }).start();
    }
}

Теперь все готовы к стрельбе.

ArrayList<GroupTask> allTasks = new ArrayList<GroupTask>();
allTasks.add(new Task1());
allTasks.add(new Task2());
new MyDisptchGroup(allTasks, this);
1
ответ дан Akabrando 30 January 2016 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: