ورود

View Full Version : انتقال 3000 رکورد از سرور به برنامه اندروید



daffy_duck376
چهارشنبه 17 شهریور 1395, 08:59 صبح
با سلام.
وب سرویسی طراحی شده که رکرود ها را با فرمت json تحویل میده . برای رکورد های کم مشکلی وجود نداره اما ممکنه اطلاعات زیاد شد برنامه اندروید به دلیلی طولانی شدن طول استرینگ دچار کرش بشه؟ کسی تجربه ای داره ؟

hamid_hr
چهارشنبه 17 شهریور 1395, 09:31 صبح
من همین کار رو انجام دادم
باید با یک thread شروع به خوندن از وب سرویس بکنید
رکورد ها رو هم مثلا 100 تا 100 تا بفرستین اینطوری مشکلی پیش نمیاد
من اطلاعات هر رکورد زیاد بود مجبور شدم یکی یکی بفرستم و تو دیتابیس گوشی ذخیره کنم

daffy_duck376
چهارشنبه 17 شهریور 1395, 12:10 عصر
ممنون از پاسخ شما اما مثلا 10 تا 10 تا فرستادن به سرور فشار نمیاره؟ چون مثلا برای هر 10 تا باید یه کوئری بزنیم درسته ؟ چون ممکنه در یک لحظه 10 کاربر به روز رسانی کنن. یا شما از روش دیگه ای استفاده کردید ؟

amirxbest
چهارشنبه 17 شهریور 1395, 12:49 عصر
لازم نیست برای هر 10 رکورد یه کوئری بزنی یه متغیر تعریف کن و هر با که کوئری select رو اجرا میکنی بر اساس اون limit کون و داده ها رو دریافت کن

daffy_duck376
چهارشنبه 17 شهریور 1395, 15:04 عصر
لازم نیست برای هر 10 رکورد یه کوئری بزنی یه متغیر تعریف کن و هر با که کوئری select رو اجرا میکنی بر اساس اون limit کون و داده ها رو دریافت کن

دوست عزیز این متغییر کجا باد تعریف بشه ؟ اگه توب سرویس تعریف بشه بعد از ارسال 10 رکورد اول از بین میره تو کلاینت هم باز فایده ای نداره چون باید مجددا به سرور ارسال بشه و تابع وب سرویس دوباره کوئری خواهد گرفت که باز بیفایده هست.

hamid_hr
چهارشنبه 17 شهریور 1395, 15:42 عصر
من این روال رو استفاده میکنم
اول تعداد رکوردها رو از وب سرویس میگیرم
بعد یه حلقه میزارم میگم رکورد اول رو بفرست
رکورد رو میگیرم
ذخیره میکنم
این طوری همه رکوردها دریافت میشه

hasan_esfahan
یک شنبه 21 شهریور 1395, 14:39 عصر
در حالت کلی این روش درست نیست

یعنی وقتی اطلاعات زیاد هست

شما باید در قالب فایل اطلاعات را بفرستید

مثلا اگر چند روز به وایبر سر نزنید و بعد کلی پیام بیاید

یک فایل دانلود میکنه

که ان اطلاعات میریزه تویی دیتابیس لوکال و سپس به کارش ادامه میدهد


بهترین کار این هست .

دلایل هم که زیاد داره

یکی سریع بودن هست .

فشار کمتر به سرور

و .... .

omidn1996
سه شنبه 23 شهریور 1395, 23:06 عصر
منظقی ترین راه فکر میکنم همون استفاده از pagination و چندتا چندتا فرستادن رکورد ها هست، در مورد فشار بر سرور هم فکر نمیکنم مشکل خاصی به وجود بیاد چون اپ های مطرح هم (دیوار - بازار - و ...) از همین روش استفاده میکنن

gilas1368
چهارشنبه 24 شهریور 1395, 19:57 عصر
منظقی ترین راه فکر میکنم همون استفاده از pagination و چندتا چندتا فرستادن رکورد ها هست، در مورد فشار بر سرور هم فکر نمیکنم مشکل خاصی به وجود بیاد چون اپ های مطرح هم (دیوار - بازار - و ...) از همین روش استفاده میکنن

دوست خوبم به این روش lazy loading میگن
ینی شما مثلا بار اول 10 تا رکورد رو میخونی و نمایش میدی و اگ کاربر لیست رو اسکرول کرد بعد 10تای بعدی رو میخونی و نمایش میدی
ضمن اینک برنامه رو طوری باید بنویسید که اطلاعات قبلی (10 تای اول مثلا) رو کش کنه و نگه داره
نه اینک اگ کاربر اسکرول کرد و رفت پائین دیگ اطلاعات قبل رو نداشته باشه

Nevercom
چهارشنبه 24 شهریور 1395, 22:28 عصر
مهمتر از تعداد رکوردها، حجم Response هست. اگر حجم زیادی نداره که نیاز نیست نگران باشید.

اگر حجم داده ها زیاد هست، یکی از راه ها همون pagination هست که گفتید (که البته هربار 10 رکورد خیلی غیرمنطقی هست)
راه دیگه هم Stream کردن داده ها هست. یعنی به جای اینکه منتظر بمونید تا کل Response رو یکجا تحویل بگیرید، داده ها رو تکه تکه دریافت کنید.
برای اینکار هم سمت سرور باید داده ها رو بصورت Stream بفرستید (مثلاً در PHP تابع ob_flush رو ببینید).

ولی باز هم میگم قبل از هرچیز چک کنید ببینید حجم رسپانس چقدر هست. ضمن اینکه اگر روی سرور gZip فعال نیست، با فعال کردنش میتونید حجم رسپانس ها رو خیلی کاهش بدید که هم باعث سریعتر شدن برنامه تون میشه و هم در ترافیک سرور و کلاینت صرفه جویی میشه. (تو این سایت میتونید چک کنید که gzip فعال هست یا نه: http://checkgzipcompression.com/?url=https%3A%2F%2Fecho.getpostman.com%2Fgzip)

برای نمونه، این آدرس رو در مرورگر لود کنید تا استریم کردن دیتا رو ببینید: https://echo.getpostman.com/stream/1000

omidn1996
پنج شنبه 25 شهریور 1395, 00:36 صبح
دوست خوبم به این روش lazy loading میگن
ینی شما مثلا بار اول 10 تا رکورد رو میخونی و نمایش میدی و اگ کاربر لیست رو اسکرول کرد بعد 10تای بعدی رو میخونی و نمایش میدی
ضمن اینک برنامه رو طوری باید بنویسید که اطلاعات قبلی (10 تای اول مثلا) رو کش کنه و نگه داره
نه اینک اگ کاربر اسکرول کرد و رفت پائین دیگ اطلاعات قبل رو نداشته باشه
بله lazy loading هم میگن منظور من از گفتن پیجینیشن در واقع همین صفحه بندی کردن اطلاعات و تکه تکه گرفتن اون بود
برای ازبین رفتن داده های قبلی هم که فکر نمیکنم مورد خیلی خاصی باشه و اگر داده های جدید رو به همون آرایه ی قبلی Add کنن فکر نمیکنم مشکل خاصی به وجود بیاد