دوست عزیز! پیامتون رو دیدم.!
وقتی از وب سرویسهای rest که استفاده میشه شما یه درخواست با یکسری پارامتر دارید ارسال میکنید به سرور سایت تون و در جواب هم صبر میکنید تا رشته ای که میخواهید برگرده حالا شما دارید یکسری درخواست رو پشت سرهم تو یک حلقه ارسال میکنید یعنی هیچ کنترلی ندارید که کدوم مقادیر برگشته کدوم برنگشته.!
بهتره برای اینجور درخواست ها حتما از روش Parallel استفاده کنید یعنی پردازش هاتون رو به صورت موازی انجام بدید چون وقتی که شما با volly اطلاعات ارسال میکنید خود کلاس براتون یکسری صف تشکیل میده با این دستور queue.add(stringRequest); ولی مشکل اینجاست که شما این Request هارو به حال خودشون رها کردین پس شما هم باید سمت کلاس خودتون بجای استفاده از حلقه از یک کلاس موازی سازی استفاده کنید.
و هر ارسال رو به صورت موازی به صورت سنکرون انجام بدید یعنی غیر همزمان اینکار انجام بشه یعنی تا دریافت اطلاعات از سرور منتظر جواب بمونه.! البته این رو از روی کدتون میگم شاید هم بتونیم آسنکرون یعنی همزمان این ارسال و دریافت هارو پردازش کنید اون دیگه باشماست.
می تونید از فریم وورک ForkJoinTask استفاده کنید که مثال براش توی همین تالار گذاشتم ویا اینکه میتونید خودتون یه کلاس موازی Parallel با حوضچه های نخ بنویسید که البته هر دوروش سختی هایی داره ولی مطمئنا بعد ها بدردتون میخوره شاید هم بگید میتونید از کلاس AsyncTask استفاده کنید. اگرهم که میخواهید ساده تر باشه میتونید با دیدن این کد که از کلاس Count Down Latch استفاده میکنه ایده بگیرید برای غیرهمزمان کردن درخواست ها فقط بگم موازی سازی نیست میتونید خودتون توی نخ ها و حوضچه ای نخ ها مثل (ThreadPoolExecuter) از این متد استفاده کنید یعنی نوشتن داده های هر نخ براتون راحتت میکنه.
public synchronized long executeTasksDownLatch(final Runnable action, int concurrency) throws InterruptedException {
final CountDownLatch ready = new CountDownLatch(concurrency);
final CountDownLatch start = new CountDownLatch(1);
final CountDownLatch done = new CountDownLatch(concurrency);
for (int i = 0; i < concurrency; i++) {
THREAD_POOL_EXECUTOR.execute(() -> {
ready.countDown(); // decrement concurrency - 1
try {
start.await(); // wait the startMyAsyncTask latch until action latch is finished.!
action.run(); // run the task in executor thread.
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // if thread is exception interrupted.
} finally {
done.countDown(); // if action latch success the run decrement concurrency - 1
// and loop the for and startMyAsyncTask the next action task.
}
});
}
ready.await(); // wait until all threads task is finished.
long startNanos = System.nanoTime();
Log.i("startNanos", "executeTasksDownLatch startMyAsyncTask: "+startNanos);
start.countDown();// decrement count - 1 = 0
done.await(); // wait until all task is finally run is ok.
Log.i("startNanos", "executeTasksDownLatch end: "+System.nanoTime());
return TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startNanos); // calculate the elapsed time for all threads is finished.
}
برای کد بالا هم به اختصار اگر بخواهم بگم گاهی می خواهید که یک نخ تا زمان رخ دادن یک رویداد منتظر بمونه ، یک CounDownLatch با یک شمارش از تعداد رویدادها که در سازنده کلاس تعریف میکنیم ساخته میشه که هر بار latch چک میشه تا زمانی که شمارش صفر بشه تا latch باز بشه بنابراین تو این متد تعداد رویداد هارو مشخص میکنید بعد یک عملیات اتفاق می افتد برای اون پردازش تا وقتی که همه عملیاتها تمام بشن وکنترل از متد خارج بشه البته این یک ایده است که عرض کردم کلا تکنیکهای زیادی داره هم زمانی و موازی سازی توی جاوا
درمنطق برنامه شما موازی سازی داریم که یکسری پردازش موازی هم باید کار کنند که شاید نسبت برگشتن پاسخ هاشون متغیر باشه پس هر Request موازی در یک نخ دیگه ای کنترل میشه و البته در جدول شما نوشته میشه و اینم بگم که فقط حواستون به نحوه نوشتن این داده ها توی جدولتون باشه اگر تقدم و تاخر ویا بهتر بگم یکپارچه سازی توی جداول تون لحاظ شده حتما بهش توجه کنید.
قطعا موازی سازی نیاز دارید ولی چون من شرایط یکپارچگی دیتابیس سرورتون و همچنین بانکهای لوکال تون رو نمیدونم نمیتونم بگم که این موازی سازی باید هم زمان باشه یا غیر همزمان به شرایط شما بستگی داره.
یه مثال کوچیک برای موازی سازی هم فکر کنید دوتا گیشه بلیط فروشی دارید وباالطبع دوصف 200 نفری هم برای تهیه بلیط حالا اگر تعداد گیشه ها رو بیشتر کنید هم صف هاتون سبک تر میشن و هم همزمان تعداد زیادی بلیط می فروشید در اینجا باجه های بلیط فروشی همون موازی کردن درخواستهاست.
اگرهم که به سورسی نیاز دارید که خوب با دیدن این متد نمیشه یک کد موازی نوشت ولی شما خودتون شروع کنید اگر کمکی بود من و خیلی از دوستان دیگه هم هستند کمک میکنن