Я использую следующее, чтобы загрузить 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;
}
после того, как диалоговое окно загрузки файла закрыто, окно возвращает ее фокус назад, так что событие фокусировки запускается.
Вы можете использовать Thread
s и Thread.join()
с Handler
s в качестве опции.
цитата из: https://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
Метод соединения позволяет Поток ждать завершения другого. Если t является объектом Thread, поток которого в данный момент выполняется,
t.join (); заставляет текущий поток приостанавливать выполнение, пока поток t не завершится. Перегрузки соединения позволяют программисту указывать период ожидания. Однако, как и в спящем режиме, объединение зависит от ОС для синхронизации, поэтому не следует предполагать, что объединение будет ждать ровно столько времени, сколько вы укажете.
Как и sleep, join реагирует на прерывание путем выхода с InterruptedException.
РЕДАКТИРОВАТЬ : Вы также должны проверить мою диспетчер событий Гист. Вам может понравиться это.
Я использую 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);