اتصال اندروید به Rest بوسیله volley

shape
shape
shape
shape
shape
shape
shape
shape

Volley

یک networking library (کتابخانه ای برای ارتباط با شبکه ) در اندروید می باشد. استفاده از این کتابخانه که توسط گوگل توسعه یافته است کار را برای برنامه نویسان اندروید بسیار راحت می کند(اتصال اندروید به Rest بوسیله volley).

با استفاده از آن دیگر خبری از HttpClient و امثال آن برای ارتباط با سرور و گرفتن اطلاعات نیست، دیگری نیازی نیست اطلاعات دریافت شده از سرور را به فرمت قابل استفاده یا همان String تبدیل کرد .

استفاده از Volley علاوه بر اینکه راحتر می باشد، سرعیتر از روش های قبلی و معمول است.

برخی از ویژگی های Volley از این قبیل می باشند :

ایجاد صف درخواست (Request Queuing)
داشتن کنترل روی حافظه و بافرینگ (Cache)
توانایی لغو درخواست ها در صف (Cancelling Request)
برای استفاده از این کتابخانه بایستی در ابتدا فایل .jar مرتبط با آن را در پوشه libs پروژه خود وارد کنید و آن را به برنامه معرفی کنید (فایل کتابخانه در انتهای آموزش قرار داده می شود. همچنین، IDE پیش فرض ما اندروید استودیو است).
برای معرفی فایل های .jar به پروژه، وارد build.gradle مربوط به app شوید و در قسمت dependencies، کد زیر را وارد کنید و سپس پروژه را sync نمایید:

compile files (‘libs/volley.jar’)

 

در مرحله بعد ما به یک Package دیگر نیازی داریم. یک Package با نام utils ایجاد کرده و سپس داخل آن کلاس LruBitmapCache را تعریف می کنیم.

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

public class LruBitmapCache extends LruCache<String, Bitmap> implements ImageLoader.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 s) {
return null;
}

@Override
public void putBitmap(String s, Bitmap bitmap) {

}
}

پس از اضافه کردن این کلاس، کار ما با این Package به اتمام می رسد.

کدهای زیر را به کلاس G خود اضافه می کنیم. توابع این کلاس در ایجاد صف درخواست، اضافه کردن درخواست به صف، دسترسی به درخواست های قرار گرفته در صف، کنسل کردن درخواست های موجود در صف و از این قبیل موارد می باشد (کد زیر، کد کلاس G به طور کامل است. کدهای مشترک را پاک کنید).

public class G extends Application {

public static final String TAG = G.class.getSimpleName();

private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;

private static G mInstance;

@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}

public static synchronized G 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);
}
}

حالا سراغ ایجاد درخواست و گرفتن اطلاعات از سرور می رویم. در این مثال قرار است ما درخواست JsonArray به سرور داشته باشیم و اطلاعات مورد نظر را دریافت کنیم. حال در MainActivity به ترتیب کدهای زیر را وارد می کنیم.

/**
* Tag Used To Cancel The Request
*/
String tag_json_array = “tag_json_array”;

همانطور که گفته شد ما توانایی Cancel کردن درخواست هایمان را داریم. این یک متغییر از نوع متن می باشد که با استفاده از آن می توانیم درخواست را Cancel کرده و از انجام آن صرف نظر کنیم.

در ادامه توضیحات تکمیلی آورده می شود.

Java
/**
* @url = Url for get json Object
*/
String url = “http://api.androidhive.info/volley/person_array.json”;
در این قسمت آدرس Url مورد نظر برای دریافت JsonArray را تعریف می کنیم.

/**
* Create Request For Get Json Array From Server
*
* Exist To Method In The Request :
* 1 : onResponse => That Get Response For Server
* If Data Exist In The Server
*
* 2 : onErrorResponse => That Show Error
* If Data Do Not Exist In The Server
*/
JsonArrayRequest jsonArrReq = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
Log.e(“LOG”, jsonArray.toString());
for (int i = 0 ; i < jsonArray.length() ; i++)
{
try {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Log.e(“LOG”, “object : ” + jsonObject.getString(“name”));
} catch (JSONException e) {
e.printStackTrace();
}
}
pDialog.hide();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
VolleyLog.e(“LOG”, volleyError.getMessage());
pDialog.hide();
}
});
/**
* @url = Url for get json Object
*/
String url = “http://api.androidhive.info/volley/person_array.json”;
در این قسمت آدرس Url مورد نظر برای دریافت JsonArray را تعریف می کنیم.

/**
* Create Request For Get Json Array From Server
*
* Exist To Method In The Request :
* 1 : onResponse => That Get Response For Server
* If Data Exist In The Server
*
* 2 : onErrorResponse => That Show Error
* If Data Do Not Exist In The Server
*/
JsonArrayRequest jsonArrReq = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
Log.e(“LOG”, jsonArray.toString());
for (int i = 0 ; i < jsonArray.length() ; i++)
{
try {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Log.e(“LOG”, “object : ” + jsonObject.getString(“name”));
} catch (JSONException e) {
e.printStackTrace();
}
}
pDialog.hide();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
VolleyLog.e(“LOG”, volleyError.getMessage());
pDialog.hide();
}
});

حال به توضیح کد بالا می پردازیم :

در ابتدا ما یک شی از کلاس JsonArrayRequest را ایجاد می کنیم. چون قرار است ما آرایه دریافت کنیم بایستی از این کلاس یک شی ایجاد کنیم. اگر اطلاعات ما Object بود از JsonObjectRequest استفاده می کنیم.

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

url : در واقع این همان آدرس صفحه مورد نظر در سرور می باشد که ما درخواست خود را به این صفحه ارسال می کنیم و پاسخ مورد نظر را نیز دریافت خواهیم کرد.

Listener : پارامتر بعدی یک Listener می باشد. این قسمت در واقع همان پاسخ ما از سرور می باشد. در واقع یک تابع می باشد که با استفاده از آن ما به داده های دریافتی از سرور می توانیم دسترسی داشته باشیم.

در این مثال ما آرایه دریافتی را به Object تبدیل کرده و آن را در خروجی نمایش داده ایم.

ErrorListener : این پارامتر هم یک Listener می باشد اما فقط خطاهای تولید شده از ارتباط با سرور و دریافت اطلاعات را در خروجی به ما اطلاع می دهد.

در نهایت بایستی درخواست را به صف درخواست ها اضافه کنیم.

AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

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

تا به اینجا ما درخواست جدید را تعریف کرده و آن را به صف درخواست ها اضافه کرده ایم و همچنین پاسخ دریافتی از سرور را نیز در خروجی چاپ کرده ایم.

لغو درخواست :

شاید ما درخواست های زیادی در صف داشته باشیم و یا شاید بخواهیم از اجرا شدن یک درخواست جلوگیری کنیم و از این قبیل موارد. با استفاده از کد زیر می توانیم به صف درخواست ها دسترسی پیدا کرده و با استفاده از شناسه هر درخواست، درخواست مورد نظر را cancel کنیم.

@Override
protected void onStop () {
super.onStop();
if (requestQueue != null) {
requestQueue.cancelAll(tag_json_obj);
}
}

 

ارسال پارامتر به سرور :

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

@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put(“name”, “Androidhive”);
params.put(“email”, “abc@androidhive.info”);
params.put(“password”, “password123”);
return params;
}

در زیر کد کامل آورده شده :

public class JsonArrayActivity extends Activity {

TextView txtName;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.json_object_activity);

txtName = (TextView) findViewById(R.id.txtName);

/**
* Tag Used To Cancel The Request
*/
String tag_json_array = “tag_json_array”;

/**
* @url = Url for get json Object
*/
String url = “http://api.androidhive.info/volley/person_array.json”;

/**
* Show Progress Dialog
* Before Get Data From Server
* Or
* Get Error From Server
*/
final ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage(“Loading… “);
pDialog.show();

/**
* Create Request For Get Json Array From Server
*
* Exist To Method In The Request :
* 1 : onResponse => That Get Response For Server
* If Data Exist In The Server
*
* 2 : onErrorResponse => That Show Error
* If Data Do Not Exist In The Server
*/
JsonArrayRequest jsonArrReq = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
Log.e(“LOG”, jsonArray.toString());
for (int i = 0 ; i < jsonArray.length() ; i++)
{
try {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Log.e(“LOG”, “object : ” + jsonObject.getString(“name”));
} catch (JSONException e) {
e.printStackTrace();
}
}
pDialog.hide();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
VolleyLog.e(“LOG”, volleyError.getMessage());
pDialog.hide();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put(“name”, “Androidhive”);
params.put(“email”, “abc@androidhive.info”);
params.put(“password”, “password123”);
return params;
}
};

AppController.getInstance().addToRequestQueue(jsonArrReq, tag_json_array);
}
}

استفاده از قابلیت Cache :

هنگامی که شما برای بار اول اطلاعاتی را از یک آدرس از سرور دریافت می کنید، می توانید برای دفعات بعد بدون ارتباط با سرور اطلاعات را دریافت کنید. این قابلیت caching نامیده می شود.

Cache cache = AppController.getInstance().getRequestQueue().getCache();
Cache.Entry entry = cache.get(url);
if (entry != null){
try {
String data = new String(entry.data, “UTF-8”);
txtName.setText(data);
pDialog.hide();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else {

}

در این قسمت ابتدا آدرس سرور مورد نظر چک می شود که قبلاٌ اطلاعاتی از این آدرس گرفته شده است یا نه، در صورتی که محتوای Cache خالی نباشد، اطلاعات درخواستی از حافظه Cache گرفته می شود و در اختیار کاربر قرار می گیرد.

در صورتی که حافظه Cache خالی باشد، اطلاعات از سرور دریافت می گردد و برای دفعات بعد از Cache دریافت می گردد.

مطالعه بیشتر

 

 

منبع

 

Java

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *