بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

طریقه لود کردن موارد لیست ویو به صورت Lazy از سرور اصولی

مدیریت گفتگو
sadeghbarout 12 سال پیش
آخرین تغییر: 11 سال پیش

سلام دوستان

من برای پروژه ام نیاز دارم تقریبا چیزی شبیه صفحه سوالات همین سایت رو توی برنامه اندرویدم پیاده کنم.

مثلا یه لیسته که 20 تا مورد از سرور لود میکنه و وقتی به انتهای 20 تا میرسیم قراره 20 تای دیگه از سرور لود بشه.

تا اینجای کار مشکلی نیست! مشکل از اونجایی پیش میاد که مثلا قراره این لیست از سرور بر اساس محبوبیت لود بشه. حالا فرض کنید 20 تای اول رو درخواست دادیم به سرور و گرفتیم. حالا 10 دقیقه بعد باید 20 تای بعدی رو لود کنیم اما ممکنه تو همین 10 دقیقه این محبوبیت ها تغییر کرده باشن و مثلا اونی که رتبه 15 رو داشته الان رتبه 25 رو داره پس اگه به سرور بگم بر اساس محبوبیت از شماره 20 تا 40 رو بهم بده ، یه داده تکراری تو کارم میاد.

همین ماجرا به صورت برعکسشم هست یعنی ممکنه تو اون 10 دقیقه رتبه یه مورد از 25 بشه 15 . اینجوری اصلا اون مورد لود نمیشه و نادیده گرفته میشه.

میخواستم ببینم شما راهی برای این مشکل سراغ دارید؟

از اونجایی که استاد هم خودشون برای این سایت این مورد رو پیاده سازی کردن میخواستم ازشون بخوام ایشون هم در این باره راهنمایی کنن.

با تشکر از همگی :)

نظرات

hamed 12 سال پیش
این به ذهن من می رسه: ما در درخواستمون بگیم مثلا تعداد آیتم های محبوب از اول تا هر جایی که تعداد آن ها به غیر از موارد تکراری بشه بیست عدد! (بدیهی بود!) حالا برای پیاده سازی آن هم می توان ID مربوط به داده های سری های قبلی را در جایی ذخیره کنیم و آیدی موارد خوانده شده مقایسه کنیم. حالا این مقایسه سمت سرور باشه یا نرم افزار میل خودتونه.
sadeghbarout 12 سال پیش
من درست متوجه منظورت نشدم! منظورت اینه که هربار همه داده هایی که قبلا گرفتیم رو بفرستیم سرور که از اولین محبوب چک کنه تا جایی که بشه 20 تا جدید و بعد یفرسته به برنامه؟ این که اصلا optimize نیست و خیلی سرور رو درگیر میکنه!
hamidd 12 سال پیش
Sadeghbarout جان کاریش نمیشه کرد. حتی برای سیستم پرسش و پاسخ سایت هم این مشکل وجود داره چون خیلی دیدم پرسش ها رو دو بار تکرار میکنه.می تونی مثل لیست پرفروشهای هفته بازار که روزی فقط یک بار توسط سیستم به طور اتوماتیک آپدیت میشه.روزی یک بار لیست علاقه مندی ها رو توی سرور بروز کنی.
صادق جان برای این طور موارد نباید مطلق نگاه کنی- همه چیز تا حدی تقریب رو میپذیره - سمت سرور میتونی و باید همچین لیست هایی رو یک بار برای درخواست های مدتی طولانی (در حد ساعت تا حتی روز) نگه داری چون اطلاعات real time نیستن و جنبه آمار دارن صرفا. پس سوالت خود به خود رفع میشه!
sadeghbarout 12 سال پیش
حمید و محمد عزیز ممنون. پس یعنی پیشنهادتون اینه که هرکی لایک میکنه یه جا نگهداری کنم یعد مثلا روزی 1 بار اطلاعات لایک ها رو بروز کنم نه؟
نه - ثبت اطلاعات همون لحظه انجام میشه - نتیجه کوئری رو کش میکنی
sadeghbarout 12 سال پیش
درکل منظورتون اینه که اطلاعاتی که کاربر الان دریافت میکنه تا آخر روز همونه و آخر روز اطلاعات ارسالی به کاربر آپدیت پشن درسته؟ راه خاصی برای کش کردن نتایج کوئری هست؟
زمانش که بستگی به خیلی چیزا داره - برای کش کردن هم یا هارد دیسک یا اصلا یه جدول تو دیتابیس !
M.heydari 12 سال پیش
صدتای اول رو بگیر و فقط 20تاشو نشون بده؛ تکراری‌ها رو هم سمت کاربر پاک کن. (یعنی تعدادی بیشتر بگیر که قابل substitute شدن باشه)
hamidd 12 سال پیش
آره.همین طور که آقای حسین زاده توضیح دادن دو تا فیلد داری. فیلد اول دائما در حال بروز رسانیه.ولی فیلد دوم مثلا فقط هر روز صبح به روزرسانی میشه و مقدارش رو باید از مقدار فیلد اول دریافت کنه.وقتی هم که کلاینت درخواست دریافت تعداد لایک ها رو به سرور فرستاد، باید مقدار فیلد دوم که فقط روزی یک بار(یا بیشتر) به روز میشه براش ارسال بشه.
البته چیزی که من گفتم کش کردن ریزالت ست هست - اطلاعات تو همون لحظه که نیازه ذخیره میشه و نیازی به دو فیلد برای لایک و امثالهم نیست - مثلا هر روز صبح آیتم ها رو بر اساس محبوبیت سورت میکنی و نگه میداری - صفحه بندی رو روی همین ریزالت ست کش شده انجام میدی
sadeghbarout 12 سال پیش
تقریبا گرفتم باید چکار کنم . تشکر از همگی :)

پاسخ‌ها 2

کاشی زاده 12 سال پیش

سلام .

شما برای انجام اینکار باید هم متد های سرور رو با یه روش خاص بگیری هم درخواست ارسالیت رو باید یه طور خاصی بفرستی که اینطور خاص این طور میباشد :

شما متد های سرور رو به این صورت میگید اطلاعات رو بدن که :

 $part = $_REQUEST['part'];
        $start = $part * 10;
        $end = $start + 10;

این مقدار بالا برای پارت بندی بسته های ارسالی از سرور هست که میگیم  چه تعداد رو نمایش بده که در دستور sql به شکل زیر استفاده میشه :

 select id, title from my_table where isActive=1 ORDER BY id DESC LIMIT $start ,$end ;

خوب این از سرور میریم سراغ کلاینت ، شما توی کلاینت هم در قسمت ادپتر لیست ویو تعداد آیتم های ArrayList رو میگیرید و منهای مثلا 3 میکنید . این منهای 3 رو بعدا میگم چیه . 

 int itemCount = lists.size() - 3;

بعد براش یه لیسنر هم مینویسید داخل متد فیل که به صورت زیر هست :

 if (itemCount == position) {
				OnPartChangeListener.onPartChange(position);
			}

خوب اون منهای 3 بالا برای این هست که بگیم هروقت کاربر سومین آیتم از آخر رو دید لیست جدید بیاد ، که عددش دلخواه هست میتونید هم منها نکنید و بگید هر وقت به ته لیست رسید خبرش کن.

خوب یکم دیگه کار داره اونم مربوط به قسمت ارتباط با سرور هست . زمانی که میخواید درخواست رو به سرور بفرستید یه مقدارم میفرستید که شماره پارتی هست که سرور باید بهتون بده که از 0 شروع میشه و میره به بالا 

توجه داشته باشید که هر بار که کلاینت موفق شد اطلاعات رو به طور کامل از سرور بخونه متغیر پارتتون رو + 1 کنید تا در مرحله بعدی پارت جدید رو بگیرید.

لازم به توضیح هم نیست لیسنر بالا هر وقت صدا زده شد باید درخواست به سرور فرستاده بشه .

نظرات

کاشی زاده 12 سال پیش
یادم رفت بگم زمانی که دارید لیست جدید رو میگیرید چک کنید که آیا این مقدار در ArrayList شما وجود داره یا نه اگر وجو داره اضافی نشه و اگر وجود نداشت اضافی بشه تا اون مشکلم حل بشه . ولی خوب هیچ وقت کسی نمیاد 15 دقیقا صبر کن تا لیست جدید بیاد معمولا این تغییرات در چند لحظه صورت میگیره و مشاهده لیست کاربر هم سریع انجام میشود
sadeghbarout 12 سال پیش
خیلی ممنون از توضیحاتتون ولی اینی که توضیح دادید مکانیزم همون lazy معمول بود که همچنان اون مشکلاتی که گفتم رو داره. حالا برای اون بخش اول میشه به قول شما داده های تکراری رو skip کرد ولی برای اون بخش دوم که داده ها جابجا میشن و میرن جز همون پارت اول چی؟ اونجا یکی از موارد اصلا دانلود نمیشه چون فرض میشه که جز پارت اول دانلود شده . اطلاعات من طوری هستن که تفریبا هرکدومشون 2 دقیقه از کاربر وقت میگیره برای خوندنشون!
کاشی زاده 12 سال پیش
والا نمیدونم چی بگم آخه 2 دقیقه خیلی زمان زیادی هست ، حالا من نمیدونم برنامتون چیه ولی من جای کاربر باشم هیچوقت 2 دقیقه صبر نمیکنم برای هر بار دریافت اطلاعات
sadeghbarout 12 سال پیش
نه منظورم این نیست که دریافت اطلاعات 2 دقیقه طول میشکه. خوندن هرکدوم از موارد 2 دقیقه طول میکشه . مثلا 10 تا که لود میشه ، رفت 20 دقیقه دیگه که کاربر درخواست 10 تای بعدی رو بکنه. منظورم اینه. خیلی ممنون از پاسخگوییت :)
PandaStudio 11 سال پیش

سلام دوستان

کسی راه حلی برای این مساله پیدا نکرد؟

منم به یه مشکل این چنینی دچارم. یه اپلیکیشن مثل دیوار را درنظر بگیرید که هر لحظه داره محصول داخلش ثبت میشه. و محصولات را هم بر اساس زمان ثبت به صورت lazy از سرور میگیره و نشون میده.

حالا اگه کوئری را طوری بنویسیم که ابتدا رکوردها را بر اساس زمان ثبت مرتب کنه و سپس با تکنیک lazy به صورت 10تا 10تا بگیره محصولی که الان داره توی لیست 10تایی اول که از سرور گرفته شده نشون داده میشه چند لحظه بعد با اضافه شدن محصول های جدید جایگاهش تغییر کرده و ممکنه توی لیست 10تایی سومی که از سرور میاد باشه و همین مشکل تکرار محصول پیش میاد.

این مشکل را باید چطور حل کرد؟ من چندین روزه درگیرشم و نتونستم حلش کنم

نظرات

Spirit 11 سال پیش
خب با همین فیلد زمان نمیشه حلش کرد؟ مثلا بر اساس زمان مرتب شد، بعد دها تاشو گرفتیم، بار بعد که میخواییم 10 تا دیگه رو بگیریم، زمان آخرین آیتم رو هم میفرستیم، میگم 10 مورد قبل این زمان رو بفرس.
PandaStudio 11 سال پیش
نه نمیشه. شما فرض کن زمان آیتم ها 1 تا 30 هست و ما 10تای اول را گرفتیم. حالا 3تا محصول هم اضافه میشه یعنی آیتم های 9 و 10 و 11 تبدیل میشن به 12 و 13 و 14. حالا موقع گرفتن 10تای دوم یعنی آیتم های 11 تا 20 2تا آیتم تکراری داریم(9 و 10 قدیمی) اگه هم بیایم طبق گفته شما زمان را دخیل کنیم و بگیم 10تای قبل از آخرین زمان را بده بازم همینطوره
hamidd 11 سال پیش
راه حلش همون استفاده از pull to refresh برای لیست ویو هست که سوالش هم دیدم مطرح کرده بودید. مثل این که به جواب رسیدین.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .