2017-01-19 5 views
0

У меня есть обработчик, который работает внутри службы. Внутри обработчика я запускаю два для циклов.Проблема с синхронизацией запросов волейбола Android

В первом цикле я беру данные из базы данных и делаю запросы на залп на итерации. Ответ от этих запросов на волейбол вносит изменения в некоторые файлы, хранящиеся в файловой системе и некоторые изменения базы данных. Второй цикл цикла должен работать над изменениями, сделанными этими запросами в первом цикле. Для этой цели второй цикл цикла должен ждать изменений, сделанных в запросах I в первом цикле. Однако для запросов в первом цикле требуется больше времени для завершения. Второй цикл цикла выполняется до того, как эти изменения будут сделаны, и, следовательно, новый запрос не будет сделан вторым циклом цикла, так как никакие изменения данных не принимаются.

Как ждать второго цикла цикла, пока все запросы от первого цикла не будут завершены?

private final class Handler extends Handler { 
    public Handler(Looper looper) { 
    super(looper); 
    } 

    @Override 
    public void handleMessage(Message msg) { 
     //1st for loop 
    for (do some database processing) { 
     volleyrequestclass.make a volley request....the response from this volleyrequest make certain changes to database and filesystem 
    } 

    //2nd for loop ...this needs to wait till all requests from loop1 are successfully completed 
    for(process on changes made by request in loop1) 
    { 
    make a volley request based on changes made by requests in first loop 
    } 
    } 
} 
+0

вы можете установить логический флаг, когда последний запрос в первом цикле завершен и использовать его как проверку второго цикла – akash93

+0

, это будет служить только проверкой завершения первого цикла .... он не будет проверять, если все запросы в первом цикле завершены .... завершение цикла и завершение запроса являются асинхронными –

+0

Я сказал **, когда последний запрос в первом цикле **, а не первый для цикла. – akash93

ответ

1

Одно решение было бы использовать RequesFuture

//1st for loop 
for (do some database processing) { 

    RequestFuture<String> future = RequestFuture.newFuture(); 
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, future, future); 
    RestPlatform.getInstance(Application.instance).getRequestQueue().add(stringRequest); 
future.get(); 
} 

Это решение остановить вас от удара параллельных запросов. Другим решением может быть:

//n is number of times loop will be running. 
final CountDownLatch signal = new CountDownLatch(n); 
//Volley Request 
//In listener or onResponse do 
signal.countdown(); 

    //1st for loop 
for (do some database processing) { 
    volleyrequestclass.make a volley request....the response from this volleyrequest make certain changes to database and filesystem 
} 
// here you need to await untill your countdown is not zero. 
try { 
    signal.await();// wait for callback 
} catch (InterruptedException e) { 
    throwTestEvironmentException(e); 
} 
//2nd for loop ...this needs to wait till all requests from loop1 are successfully completed 
for(process on changes made by request in loop1) 
{ 
make a volley request based on changes made by requests in first loop 
} 

Так что эти два решения, которые могут работать эффективно.