Volley

مستندات جامع اندروید

نسخه 1.0.3

یکی دیگر از کتابخانه‌هایی که برای انجام یک درخواست REST API در اندروید قابل استفاده است، کتابخانه Volley است. در این بخش از پروژه، مشابه کاری که در بخش قبل (Retrofit) انجام داده‌ایم را با Volley انجام می‌دهیم. پس از لمس طولانی در یک نقطه و رسم یک نشانگر در آن‌ نقطه، نام محله و آدرس آن نقطه در Bottom sheet نوشته خواهد شد.

فهرست مطالب این صفحه

توضیحات اولیه در مورد وب‌سرویس «تبدیل موقعیت به آدرس» و همچنین بخش‌هایی از کد که در بخش (Retrofit) آمده بود، مجددا توضیح داده نخواهد شد.

build.gradle (Module: app):

برای استفاده از کتابخانه Volley، وابستگی زیر را به مجموعه وابستگی‌های این فایل اضافه کنید:

            implementation 'com.android.volley:volley:1.0.0'
        

APIVolley.java:

تنها بخشی متفاوت این کد، نحوه پیاده‌سازی متد neshanReverseAPI است.

ابتدا آدرس درخواست (با طول و عرض جغرافیایی مورد نظر) به دست می‌آید و در متغیر requestURL ذخیره می‌شود. سپس طول و عرض جغرافیایی با ۶ رقم اعشار و جدا شده از هم با استفاده از یک ویرگول به یک رشته تبدیل می‌شود تا در زمانی که وب‌سرویس قادر به تشخیص آدرس مکانی نباشد، این رشته به جای آدرس آن مکان نشان داده شود.

یک شی از نوع StringRequest با نام reverseGeoSearchRequest ساخته می‌شودو به عنوان ورودی به آن، نوع درخواست – که در اینجا GET است- و آدرس درخواست – که در بالاتر آماده شد – و یک Listener برای پاسخ و یک Listener برای خطا داده می‌شود.

متد onResponse به صورت زیر Override می‌شود که ابتدا یک JSONObject از رشته پاسخ ورودی این متد ساخته می‌شود و رشته همسایگی و آدرس از آن دریافت می‌شود. در صورتی که رشته دریافتی برای همسایگی و آدرس برابر با رشته null نباشد، یعنی همسایگی و آدرس به درستی دریافت شده است، در این صورت این اطلاعات در Bottomsheet ذخیره نشان داده می‌شود. در صورتی که یکی از این دو مورد برابر با رشته null باشد یا Exception ای رخ دهد، رشته ساخته شده از روی طول و عرض جغرافیایی در Bottom sheet نمایش داده می‌شود.

در ادامه در متد getHeaders یک Map<String, String> ساخته و با استفاده از متد put کلید API درون Header درخواست قرار می‌گیرد.

در پایان متد newRequestQueue از کلاس Volley صدا زده می‌شود و با استفاده از متد add، درخواست رشته‌ای ساخته شده به صف درخواست‌ها اضافه می‌شود.

            private void neshanReverseAPI(LngLat loc) {
        String requestURL = "https://api.neshan.org/v1/reverse?lat=" + loc.getY() + "&lng=" + loc.getX();
        final String latLngAddr = String.format("%.6f", loc.getY()) + "," + String.format("%.6f", loc.getX());

        RequestQueue requestQueue = Volley.newRequestQueue(this);

        StringRequest reverseGeoSearchRequest = new StringRequest(
                Request.Method.GET,
                requestURL,
                new com.android.volley.Response.Listener<String>() {

                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject obj = new JSONObject(response);
                            String neighbourhood = new String(obj.getString("neighbourhood").getBytes(StandardCharsets.ISO_8859_1),"UTF-8");
							 String address = new String(obj.getString("address").getBytes(StandardCharsets.ISO_8859_1),"UTF-8");

                            // if server was able to return neighbourhood and address to us
                            if(!neighbourhood.equals("null") && !address.equals("null")) {
                                addressTitle.setText(neighbourhood);
                                addressDetails.setText(address);
                            }
                            else{
                                addressTitle.setText("آدرس نامشخص");
                                addressDetails.setText(latLngAddr);
                            }

                        } catch (Exception e) {

                            addressTitle.setText("آدرس نامشخص");
                            addressDetails.setText(latLngAddr);
                        }
                    }
                }, new com.android.volley.Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        }){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String>  params = new HashMap<>();
                // TODO: replace "YOUR_API_KEY" with your api key
                params.put("Api-Key", "YOUR_API_KEY");
                return params;
            }
        };

        // Add the request to the queue
        requestQueue.add(reverseGeoSearchRequest);
    }