سلام دوستان
با توجه به تعداد سوالات بالا درباره نحوه استفاده از این کتابخونه اطلاعات ، نحو ارسال و دریافت اطلاعات باهاش و... هر چی در رابطه با این موضوع میدونم با عزیزان به اشتراک میذارم ، به امید اینکه بدردتون بخوره و به امید داشتن ایرانی آباد...
شروع مبحث :
کتابخانه volley در حقیقت یک کتابخانه شبکه(معمولا برای استفاده از اینترنت) در آندروید است که فراخوانی شبکه را بسیار ساده تر، سریع تر و بدون نیاز به نوشتن حجم زیادی از کدها کرده است. به طور پیش فرض کتابخانه volley به صورت غیرهمزمان(asynchronously) کار میکند، پس نیاز نیست که برای استفاده از asynctask نگران باشید.
volley ویژگی های منحصر به فردی دارد که بعضی ار آنها عبارتند از:
1.صف درخواست و الویت بندی
2.استفاده موثر از cache و مدیریت حافظه
3.توسعه و سفارشی سازی کتابخانه با توجه به نیاز ما
4.لغو درخواست
مراحل استفاده :
1.ساخت یک پروژه جدید
1.در Android Studio یک پروژه جدید، ایجاد میکنیم.
2.برای سازماندهی بهتر برنامه، دو بسته (packages) بسازید و نام آن ها را app و utils قراردهید.
3.قسمت build.gradle را باز کنید و کتابخانه volley را به آن بیافزایید.
compile ‘com.mcxiaoke.volley:library-aar:*.*.*0’
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.volley:volley:1.0.0'
}
1.1ایجاد کلاس Volley Singleton
4.در پکیج utils، یک کلاس به نام LruBitmapCache.java بسازید و کدهای زیر را درون آن قرار دهید. این کلاس برای مدیریت cache مربوط به عکس استفاده میشود.
package ir.peymanf11.volleyexamples.volley.utils;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
public class LruBitmapCache extends LruCache<String, Bitmap> implements
ImageCache {
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public LruBitmapCache() {
this(getDefaultLruCacheSize());
}
public LruBitmapCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
5.درون پکیج app، یک کلاس به نام AppController.java که از Application ارث بری(extend) میکند بسازید و کدهای زیر را درون آن قرار دهید.
package ir.peymanf11.volleyexamples.app;
import info.androidhive.volleyexamples.volley.utils.LruBi tmapCache;
import android.app.Application;
import android.text.TextUtils;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class AppController extends Application {
public static final String TAG = AppController.class
.getSimpleName();
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static AppController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized AppController getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public ImageLoader getImageLoader() {
getRequestQueue();
if (mImageLoader == null) {
mImageLoader = new ImageLoader(this.mRequestQueue,
new LruBitmapCache());
}
return this.mImageLoader;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
// set the default tag if tag is empty
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}
6. اکنون AndroidManifest.xml را باز کنید و مجوز استفاده از INTERNET را درون آن قرار دهید.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ir.peymanf11.volleyexamples"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="ir.peymanf11.volleyexamples.app.AppC ontroller"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- all activities and other stuff -->
</application>
</manifest>
در حال حاضر راه اندازی های اولیه برای volley انجام شده است. اکنون بیایید فعالیت های لازم برای درخواست http را انجام دهیم.
2.ساخت درخواست JSON
volley به صورت ساده درخواست json را فراهم میکند. اگر شما نیاز به پاسخ در شی json دارید باید از کلاس JsonObjectRequest استفاده کنید و در صورت json پاسخی دارد باید از کلاس JsonArrayRequest استفاده کنید.
2.1.ساخت json object request
کد زیر یک درخواست json را که با “{” نشانه گذاری شده است را شروع میکند.
// Tag used to cancel the request
String tag_json_obj = "json_obj_req";
String url = "http://api.androidhive.info/volley/person_object.json";
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,
url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
// hide the progress dialog
pDialog.hide();
}
});
// Adding request to request queue
AppController.getInstance().addToRequestQueue(json ObjReq, tag_json_obj);
2.2. ساخت json array request
کد زیر یک درخواست json را که در آن پاسخ با “[” نشانه گذاری شده است را شروع میکند.
// Tag used to cancel the request
String tag_json_arry = "json_array_req";
String url = "http://api.androidhive.info/volley/person_array.json";
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
JsonArrayRequest req = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, response.toString());
pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
pDialog.hide();
}
});
// Adding request to request queue
AppController.getInstance().addToRequestQueue(req, tag_json_arry);
3. ساخت درخواست String
کلاس StringRequest برای دریافت هرنوع اطلاعات که از نوع string است را میتوان استفاده کرد. این درخواست میتواند json, xml, html یا… باشد.
// Tag used to cancel the request
String tag_string_req = "string_req";
String url = "http://api.androidhive.info/volley/string_response.html";
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
StringRequest strReq = new StringRequest(Method.GET,
url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response.toString());
pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
pDialog.hide();
}
});
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strR eq, tag_string_req);
4.اضافه کردن post parameters
واضح است که ما گاهی اوقات نیاز به ارائه درخواست داریم. برای انجام این کار ما نیاز به استفاده از ()getParams برای یک ارزش کلیدی داریم.
به عنوان مثال در مثال زیر من یک نام، ایمیل و رمز عبور ارسال میکنم.
// Tag used to cancel the request
String tag_json_obj = "json_obj_req";
String url = "http://api.androidhive.info/volley/person_object.json";
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
pDialog.hide();
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("name", "Androidhive");
params.put("email", "abc@androidhive.info");
params.put("password", "password123");
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(json ObjReq, tag_json_obj);
5.اضافه کردن request headers
درست مانند اضافه کردن پارامتر درخواست، برای ارسال هدر درخواست (headers) ما باید از ()getHeaders بهره ببریم. در این مثال ارسال مطالب، نوع و apiKey درخواست شده است.
// Tag used to cancel the request
String tag_json_obj = "json_obj_req";
String url = "http://api.androidhive.info/volley/person_object.json";
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
pDialog.hide();
}
}) {
/**
* Passing some request headers
* */
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json");
headers.put("apiKey", "xxxxxxxxxxxxxxx");
return headers;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(json ObjReq, tag_json_obj);
6.ساخت Image request
volley یک عنصر سفارشی سازی شده نمایش تصویر به نام NetworkImageView برای نمایش یک عکس از URL را معرفی کرده است.
6.1 بارگذاری تصویر در NetworkImageView
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
// If you are using NetworkImageView
imgNetWorkView.setImageUrl(Const.URL_IMAGE, imageLoader);
6.2 اگر شما میخواهید تصویر را در ImageView به جای NetworkImageView استفاده کنید، میتوانید به صورت زیر عمل کنید. در کد زیر ما بازخورد موفقیت (success) و خطا (error ) را داریم و باتوجه به نیاز از آنها بهره میبریم. در زیر درون متد ()onResponse از ()response.getBitmap برای بارگذاری تصویر در ImageView استفاده میکنیم.
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
// If you are using normal ImageView
imageLoader.get(Const.URL_IMAGE, new ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Image Load Error: " + error.getMessage());
}
@Override
public void onResponse(ImageContainer response, boolean arg1) {
if (response.getBitmap() != null) {
// load image into imageview
imageView.setImageBitmap(response.getBitmap());
}
}
});
6.3 تعریف placeholder image and error image
در اینجا یک دیگر از راه های نمایش تصویر در ImageView استفاده از placeholder image and error image است. placeholder image and error image زمانی نمایش دادده خواهد شد که تصویر دانلود شود. اگر تصویر دانلود نشود، بخش خطا نمایش داده خواهد شد.
// Loading image with placeholder and error image
imageLoader.get(Const.URL_IMAGE, ImageLoader.getImageListener(
imageView, R.drawable.ico_loading, R.drawable.ico_error));
7.مدیریت کش(cache) در volley
Volley از مکانیزم قوی و قدرتمند برای حفظ کش(cache) استفاده میکند. این فعالیت موجب صرفه جویی زیادی در مصرف پنهای باند و مدت زمان انتظار کاربران میشود. در زیر چند روش استفاده از کش(cache) ذکر شده است:
7.1 بارگذاری تصویر از کش(cache)
مانند زیر شما میتونید کش(cache) را قبل از برقراری تماس با URL بررسی کنید.
Cache cache = AppController.getInstance().getRequestQueue().getC ache();
Entry entry = cache.get(url);
if(entry != null){
try {
String data = new String(entry.data, "UTF-8");
// handle data, like converting it to xml, json, bitmap etc.,
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}else{
// Cached response doesn't exists. Make network call here
}
7.2 باطل کردن کش (cache)
باطل کردن کش(Cache) به معنی بی اعتبار کردن آن است و نه به معنی حذف کامل آن. Volley همچنان از کش(Cache) استفاده میکند تا زمانی که داده(data) جدیدی را از شبکه دریافت میکند و سپس داده(data)های جدیدی را دریافت میکند و از آنها استفاده میکند.
AppController.getInstance().getRequestQueue().getC ache().invalidate(url, true);
7.3 خاموش کردن کش(cache)
اگر شما میخاید استفاده از کش (cache) را غیرفعال کنید میتوانید از ()setShouldCache برای انجام این کار استفاده کنید.
// String request
StringRequest stringReq = new StringRequest(....);
// disable cache
stringReq.setShouldCache(false);
7.4 حذف کش(Cache) مربوط به یک دامنه خاص
AppController.getInstance().getRequestQueue().getC ache().remove(url);
7.5 حذف تمامی کش(Cache)ها
شما میتونید به صورت زیر تمامی کش(Cache)ها را به صورت زیر حذف کنید.
AppController.getInstance().getRequestQueue().getC ache().clear(url);
8.لغو درخواست
شاید شما هم تا الان متوجه شده اید که صف درخواست دو مقدار میپذیرد. یکی از اینها شی است و دیگری تگ درخواست است((RequestQueue(request, tag). این تگ برای شناسایی درخواست در زمان لغو آن است. اگر تگ تعداد زیادی درخواست دارد تمام آن درخواست ها لغو میشود. متد ()cancellAll برای لغو هر درخواستی استفاده میشود.
8.1 لغو یک درخواست
در کد زیر ما درخواستی با تگ “feed_request” را لغو میکنیم.
String tag_json_arry = "json_req";
ApplicationController.getInstance().getRequestQueu e().cancelAll("feed_request");
8.2 لغو تمامی درخواست ها
در کد زیر ما تمامی درخواست ها را لغو کرده ایم.
ApplicationController.getInstance().getRequestQueu e().cancelAll();
9.الویت بندی درخواست
اگر شما درحال چندین درخواست به صورت همزمان هستید میتوانید آنها را براساس نیازتان الویت بندی کنید، الویت ها به صورت عادی، پایین، فوری و بالا است.
private Priority priority = Priority.HIGH;
StringRequest strReq = new StringRequest(Method.GET,
Const.URL_STRING_REQ, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response.toString());
msgResponse.setText(response.toString());
hideProgressDialog();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
hideProgressDialog();
}
}) {
@Override
public Priority getPriority() {
return priority;
}
};
.