View Full Version : سوال درباره کتابخانه Volley
hamedg1366
پنج شنبه 11 شهریور 1395, 10:17 صبح
با سلام . عرض ادب خدمت دوستان عزیز
آیا امکانش هست چندین مقدار متفاوت کش با کتابخوه Volley انجام داد ؟؟
بعنوان مثال ، حساب کنید محصولات "W" و "y" و "z" و "x" رو داریم که هر کدوم مشخصات خودش رو دارن ، بجای اینکه بیایم برای هر کدوم یه اکتیویتی ایجاد کنیم ، یه اکتیویتی ایجاد میکنیم برای همه و با تفکیک میکنیم که اگه متغیر مقدارش 1 بود پس x , اگه 2 بود y و... اطلاعاتش رو از نت واکشی میکنیم ،
حالا سوال من اینجاست که چطور اطلاعات هر کدوم رو کش کنم که اطلاعات محصول قبلی که کش شده از بین نره
با تشکر
tux-world
پنج شنبه 11 شهریور 1395, 18:54 عصر
ببینید کش تو volley کار آسونی نیست. دردسرهای زیادی داره مخصوصا زمانی که شما میخایید آپدیت کنید. اگه تازه با این کتابخونه و اندروید آشنا شدید دورش خط بکشید چون هم سردرگم میشید و هم اینکه زده میشید. بهتره از LruCach استفاده کنید که داکیومنتهای خوبی داره. بعد اینکه از volley گرفتید با اون کش کنید تا زمانی که برنامه بسته نشده
hamedg1366
جمعه 12 شهریور 1395, 00:22 صبح
ببینید کش تو volley کار آسونی نیست. دردسرهای زیادی داره مخصوصا زمانی که شما میخایید آپدیت کنید. اگه تازه با این کتابخونه و اندروید آشنا شدید دورش خط بکشید چون هم سردرگم میشید و هم اینکه زده میشید. بهتره از LruCach استفاده کنید که داکیومنتهای خوبی داره. بعد اینکه از volley گرفتید با اون کش کنید تا زمانی که برنامه بسته نشده
با تشکر از پاسخ شما ، فک کنم من منظورمو نتونستم خوب برسونم یا جستجوم از پاسخ شما درست نبوده ،
LruCach که معرفی فرمودید بیشتر توی لود و کش تصویر استفاده میشه (نمونه از استک آور فلو (http://stackoverflow.com/questions/11623994/example-using-androids-lrucache)) ،
سوال بنده اینه که چطور Multi Cache توسط Vollay انجام بدم همین (اطلاعات متنی) مثلا ، کاربر تو برنامه اگه یه بار مشخصات کالای 1 رو دید و بعد مشخصات کالای 2 رو دید، در حالت آفلاین مشخصات هر دو تا رو داشته باشم (با کمک کش vollay) نه آخرین کالای دیده شده رو .
Nevercom
جمعه 12 شهریور 1395, 02:18 صبح
اگر Volley از استانداردهای HTTP پشتیبانی کنه (که منطقاً باید اینطور باشه) برای کش کردن کاری خاصی نیاز نیست انجام بدید.
فقط توجه کنید که خود وب سرویس باید هدرهای مربوط به کش رو ارسال کنه. درواقع وب سرویس به کلاینت ها اعلام می کنه که هر کدوم از ریسورس ها رو تا زمان مشخصی کش کنه.
ضمن اینکه در این حالتی که نیاز دارید نتیجه های مختلف کش بشه، و نه آخرین رسپانس، باید وب سرویس رو به شکلی طراحی کنید که هر کدوم از اینها یک ریسورس جداگانه به حساب بیاد
مثلاً بجای اینکه برای دریافت اطلاعات محصولات، همه به یک Endpoint ختم بشن و اطلاعات مشخص کننده کد محصول رو بعنوان پارامتر ارسال کنید، API رو به شکلی طراحی کنید که برای محصولات متفاوت، URL جداگانه فراخوانی بشه (و در نتیجه جداگانه کش بشن
درواقع HTTP Clientها بر اساس Endpoint عملیات کش رو انجام میدن، و پارامترهای ارسالی نادیده گرفته میشه.
مثلاً بجای:
http://your-site.ir/product?id=1
http://your-site.ir/product?id=2
به این شکل طراحی کنید:
http://your-site.ir/product/1
http://your-site.ir/product/2
در مثال اول در هر دو حالت Endpoint یکی هست، اما پارامترها بصورت Query String ارسال شده. درحالی که در حالت دوم برای دو محصول، دو Endpoint جداگانه داریم.
البته اینهایی که عرض کردم، تئوری هست و شخصاً تستشون نکردم. درواقع عملیات کش وابسته به هدرهایی هست که سرور ارسال می کنه (Cache-Control, Expires) که کلاینت تصمیم بگیره باید کش بکنه یا نه
به هرعنوان اگر قصد دارید پروسه ی کش رو خودتون مدیریت کنید، احتمالاً این پاسخ ها در StackOverflow مفید خواهد بود:
http://stackoverflow.com/a/32022946/1686304
http://stackoverflow.com/a/16852314/1686304
spiderman200700
جمعه 12 شهریور 1395, 12:13 عصر
همونطور که جناب Nevercom (http://barnamenevis.org/member.php?89707-Nevercom) گفتن شما کافیه برای گرفتن اطلاعات هر محصول یک URL مجزا در نظر بگیری. اینجوری Volley هر کدوم از URL ها رو به صورت مجزا کش میکنه.
hamedg1366
جمعه 12 شهریور 1395, 13:37 عصر
فقط توجه کنید که خود وب سرویس باید هدرهای مربوط به کش رو ارسال کنه. درواقع وب سرویس به کلاینت ها اعلام می کنه که هر کدوم از ریسورس ها رو تا زمان مشخصی کش کنه.
به این شکل طراحی کنید:
http://your-site.ir/product/1
http://your-site.ir/product/2
درواقع عملیات کش وابسته به هدرهایی هست که سرور ارسال می کنه (Cache-Control, Expires) که کلاینت تصمیم بگیره باید کش بکنه یا نه
با تشکر از شما آقای Nevercom تمام مطالب شما کاملا درست هستن و وقتی لینک های مختلف رو کش میکنیم تا مدت زمان مد نظر باقی میمونن ، فقط از اونجایی که سواد php بنده در حد کمی هستش سوالی که برام پیش میاد اینه که چطور برای هر محصول لینک (یا هدر) جداگانه در وب سرویس ایجاد کنم ، تنوع محصولات که ممکنه تا چندصد مورد باشه ذهن منو درگیر خودش کرده ، لطفا در این زمینه نیز راهنمایی بفرمائید
hamedg1366
جمعه 12 شهریور 1395, 13:44 عصر
همونطور که جناب Nevercom (http://barnamenevis.org/member.php?89707-Nevercom) گفتن شما کافیه برای گرفتن اطلاعات هر محصول یک URL مجزا در نظر بگیری. اینجوری Volley هر کدوم از URL ها رو به صورت مجزا کش میکنه.
ممنون میشم راهنمایی بفرمائید ، چگونه این مورد رو انجام بدم ،
بنده id کالا رو با متد Post در کتابخونه Vollay به وب سرویس ارسال و اونجا با کوئری از ذیتابیس اطلاعات رو بصورت Json باز پس میفرستم ،
spiderman200700
جمعه 12 شهریور 1395, 14:20 عصر
برای انجام این کار باید وب سرویس رو جوری تغییر بدید که برای هر کالا یک URL مجزا در نظر گرفته بشه نه اینکه به برای هر محصول یه پارامتر به یک URL کلی فرستاده بشه.
جناب Nevercom (http://barnamenevis.org/member.php?89707-Nevercom) مثالشو زدن
Nevercom
جمعه 12 شهریور 1395, 15:14 عصر
ممنون میشم راهنمایی بفرمائید ، چگونه این مورد رو انجام بدم ،
بنده id کالا رو با متد Post در کتابخونه Vollay به وب سرویس ارسال و اونجا با کوئری از ذیتابیس اطلاعات رو بصورت Json باز پس میفرستم ،
من از Slim برای اینکار استفاده می کنم: http://www.slimframework.com/
tux-world
جمعه 12 شهریور 1395, 17:58 عصر
دوستان موارد خیلی قشنگی گفتن. کش کردن دردسر آنچنانی نداره ولی اگه بخایید کش رو ریلود کنید چیکار میکنید؟ فرض کنیم که هدر ارسالی از سمت وب ۳۶۰۰۰ باشه. این مورد دردسر داره چون وقتی که کش میکنید نمیتونید به اجزای مستقیم یا خاصیتهای اون دسترسی داشته باشید و اون رو آپدیت کنید برای ریلود یه چیز خاص اره مشکلی نیست ولی اگه یه لیست رو بخایید آپدیت کنید چطور؟ . شاید من اشتباه میکنم خوشحال میشم اگه راهکاری به ذهنتون میرسه.
peymanf11
شنبه 13 شهریور 1395, 16:05 عصر
دوستان موارد خیلی قشنگی گفتن. کش کردن دردسر آنچنانی نداره ولی اگه بخایید کش رو ریلود کنید چیکار میکنید؟ فرض کنیم که هدر ارسالی از سمت وب ۳۶۰۰۰ باشه. این مورد دردسر داره چون وقتی که کش میکنید نمیتونید به اجزای مستقیم یا خاصیتهای اون دسترسی داشته باشید و اون رو آپدیت کنید برای ریلود یه چیز خاص اره مشکلی نیست ولی اگه یه لیست رو بخایید آپدیت کنید چطور؟ . شاید من اشتباه میکنم خوشحال میشم اگه راهکاری به ذهنتون میرسه.
در هنگام کش کردن هر کدوم از اطلاعات با استفاده از کتابخانه Vollay میتوان به آنها خاصیت های زیبایی داد ، از جمله تعیین زمان حذف شدن کش و یا آپدیت شدن آن ، ایتن اتفاق در پس زمینه رخ میدهد
final long cacheHitButRefreshed = 3 * 60 * 1000; // in 3 minutes cache will be hit, but also refreshed on background
final long cacheExpired = 24 * 60 * 60 * 1000; // in 24 hours this cache entry expires completely
final long softExpire = now + cacheHitButRefreshed;
final long ttl = now + cacheExpired;
Cache.Entry entry = new Cache.Entry();
entry.data = response.data;
entry.etag = serverEtag;
entry.softTtl = softExpire;
entry.ttl = ttl;
entry.serverDate = serverDate;
entry.responseHeaders = headers;
peymanf11
شنبه 13 شهریور 1395, 16:10 عصر
در پاسخ به این دوست عزیزمون هم بگم شما میتونین در هنگام کش کردن با توجه به مواردی که در حال پست کردن هستین کش رو مقدار دهی کنین و در موارد بعدی به اونها دسترسی داشته باشین ، این تیکه کد برای راهنمایی شماس ،
Map<String, String> params = yourData;
JsonArrayRequest request = new JsonArrayRequest(Request.Method.POST, url,
new Response.Listener<JSONArray>() {
... Needed codes
},
new Response.ErrorListener() {
...
}
){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
@Override
public String getCacheKey() {
return generateCacheKeyWithParam(super.getCacheKey(), params);
}
};
و
public class MyRequest extends com.android.volley.Request<MyResponse> {
...
@Override
protected Response<MyResponse> parseNetworkResponse(NetworkResponse response) {
String jsonString = new String(response.data);
MyResponse MyResponse = gson.fromJson(jsonString, MyResponse.class);
return Response.success(MyResponse, HttpHeaderParser.parseIgnoreCacheHeaders(response) );
}
}
همچنین میتونید یه کلاس شخصی (CustomGetPostRequest) برای کش اطلاعات به وجود بیارین و اونجا کارهای مربوط به کش رو انجام بدین
Code for Custom Class is following
public class CustomGetPostRequest extends Request<JSONObject> {
private int mMethod;
private String mUrl;
Map<String, String> mParams= new HashMap<String ,String>();
private Response.Listener<JSONObject> mListener;
HashMap<String, String> headers = new HashMap<String, String>();
public CustomGetPostRequest(int method, String url, Map<String, String> params,
Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
mMethod = method;
mUrl = url;
Log.d("Main URL",mUrl);
mParams = params;
mListener = reponseListener;
}
@Override
public String getUrl() {
if(mMethod == Request.Method.GET) {
StringBuilder stringBuilder = new StringBuilder(mUrl);
Iterator<Map.Entry<String, String>> iterator = mParams.entrySet().iterator();
int i = 1;
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
if(i == 1) {
stringBuilder.append("?" + entry.getKey() + "=" + entry.getValue());
} else {
stringBuilder.append("&" + entry.getKey() + "=" + entry.getValue());
}
iterator.remove(); // avoids a ConcurrentModificationException
i++;
}
mUrl = stringBuilder.toString();
Log.d("Converted URL",mUrl);
}
return mUrl;
}
@Override
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
Log.d("getParams","Called");
return mParams;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
// HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
// headers.put ("Content-Type", "application/x-www-form-urlencoded");
return headers;
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
if (response.statusCode == 200)// Added for 200 response
return Response.success(new JSONObject(),HttpHeaderParser.parseCacheHeaders(re sponse));
else
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
// TODO Auto-generated method stub
mListener.onResponse(response);
}
}
(کدها کپی می باشد)
tux-world
شنبه 13 شهریور 1395, 21:35 عصر
در هنگام کش کردن هر کدوم از اطلاعات با استفاده از کتابخانه Vollay میتوان به آنها خاصیت های زیبایی داد ، از جمله تعیین زمان حذف شدن کش و یا آپدیت شدن آن ، ایتن اتفاق در پس زمینه رخ میدهد
ممنون. سوال من این بود الان از بین چند تا عکسی که کش شده یکی از اونها رو چطوری رفرش میکنید؟ فرض میکنیم که تایم اکسپایر برای اون عکسه ۲۴ ساعت در نظر گرفته شده. حالا تو این مدت چند بار بخاییم دستی اون عکس رو تو کش رفرش کنیم چیکار کنیم؟ اسکپایر هم نشده ولی عکس تغییر داده شده و باید عکسی که تو کش بوده جدید بشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.