آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

sadeghbarout  11 سال پیش  11 سال پیش
+4 0

سلام دوستان

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

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

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

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

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

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

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

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

سلام .

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

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

 $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 کنید تا در مرحله بعدی پارت جدید رو بگیرید.

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

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

سلام دوستان

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

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

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

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

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

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