2013-02-20 3 views
0

Я использую AsyncHttpClient, чтобы получить некоторые JSON. Мой метод будет разбираться через JSON и будет запускать другой запрос на получение, поэтому я фактически не знаю, сколько потоков работает. После некоторого поиска, я думаю, я мог бы использовать ThreadPoolExecutor, чтобы узнать, когда все мои потоки закончены, поэтому я могу писать в базу данных. Как исполнитель узнает, что я отправил задание, если я использую AsyncHttpClient.get()?AsyncHttpClient с ThreadPoolExecutor, чтобы узнать, когда все задачи завершены?

AsyncHttpClient client = new AsyncHttpClient(); 
int limit = 20; 
BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(limit); 
ThreadPoolExecutor executor = 
         new ThreadPoolExecutor(limit, limit, 20, TimeUnit.SECONDS, q); 
client.setThreadPool(executor); 
parseSilo(url, context); // this fires client.get() ... as it encounters urls in JSON feed 
executor.shutdown(); 
while (!executor.awaitTermination(10, TimeUnit.SECONDS)) { 
     Log.e(TAG, executor.getTaskCount() + " tasks left"); 
} 

ответ

0

Я не вижу, где вы представить свою работу в код ThreadPoolExecutor

Образец:

executor.execute(new Runnabale() { 
    public void run() { 
     // your job code 
    } 
}); 

Edit:

Я просто заметил, что вы заменяемое по умолчанию ThreadPoolExecuter из AsyncHttpClient, поэтому он будет использоваться при выдаче запроса (например, get), он должен работать без явной отправки каких-либо сообщений в executor

Вы также можете переопределить метод terminated(), а не цикл, пока все задачи не закончатся.

+0

Правильно, возможно, мой вопрос не был ясен. Как исполнитель узнает, что я отправил задание, если я использую AsyncHttpClient.get()? – heero

+0

Вы переопределяете «ThreadPoolExecuter» по умолчанию «AsyncHttpClient», поэтому он будет использовать его при выдаче запроса. – iTech

+0

. Хорошо. Думаю, теперь я понимаю, но это плохо, поскольку AsyncHttpClient.get() является асинхронным вызовом? – heero