2013-07-25 1 views
4

У меня есть две задач асинхронных, а именно задачи 1 и задачи 2.Правильный способа цепи 2 задачи в асинхронном андроиде

Мне нужно запустить задачу 1, а затем задание 2 только после, но я не хочу, чтобы соедини два путем вызова задачи 2 в реализации onPostExecute задачи 1; потому что я использую задачу 1 как самостоятельную в других обстоятельствах.

У меня есть способ, чтобы две задачи асинхронного программирования были определены без ограничения друг на друга и связать их в определенных обстоятельствах?

Большое спасибо за помощь.

+0

Можете ли вы сделать простой if-else в onPostExecute задачи 1, чтобы запустить/не задание 2? –

+0

в onPostExecute из первого вы можете вызвать событие (намерение, метод, обработчик, ...), которые запускают второй –

+0

@ Cԃ ա ԃ Это может быть возможным решением, но я пытаюсь понять, есть ли более быстрый способ достичь это – Yash

ответ

-1

Вы можете сделать следующее:

YourAsyncClass1 thread1 = new YourAsyncClass1(); 
thread1.execute(inputArgument1); 

    try { 
     outputResult1 = thread1.get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 
if(outputResult1 == true /*Or expected result*/){ 
    YourAsyncClass2 thread2 = new YourAsyncClass2(); 
    thread2.execute(inputArgument2); 
} 
+0

спасибо за ответ. Но если задача 1 занимает 10 минут, то попытка try catch будет выполняться только один раз до отметки 10 минут и, следовательно, отсутствует, когда задача 1 фактически завершается? – Yash

+0

Привет, Дело в том, что с этим вы вызываете 'thread1.get()', и эта часть отвечает за ожидание. Блок 'try {} catch {}' действительно будет выполнен только один раз, но ожидание (целых 10 минут) выполняется при первом проходе блоком и в той части, о которой я упоминал. – g00dy

+0

Я попробую этот подход как можно скорее. Но если посмотреть на это решение, если я запустил thread1.get() в потоке пользовательского интерфейса, он будет заморозить поток пользовательского интерфейса в течение всего 10 минут? Поэтому я предполагаю, что я должен вызвать .get() в другой задаче Async. Пожалуйста, поправьте меня, если я ошибаюсь. – Yash

0

Вы можете попробовать что-то вроде этого:

final Executor directExecutor = new Executor() { 
    public void execute(Runnable r) { 
    r.run(); 
    } 
}; 
AsyncTask.execute(new Runnable() { 
    task1.executeOnExecutor(directExecutor, params1); 
    task2.executeOnExecutor(directExecutor, params2); 
}); 

я не имею Android SDK на моей машине, так что я не могу проверить его ,