معرفی کتابخانه Volley

درس قبلی ||||| درس بعدی

قبل از شروع مطالعه باید با آموزش زیر آشنا باشید:

تحلیل فایل json در اندروید استودیو

جهت ارتباط با اینترنت باید کتابخانه Volley را به اندروید استودیو اضافه کرد. برای این منظور در فایلbuild.gradle کد زیر را به قسمت dependencies اضافه کنید.

implementation 'com.android.volley:volley:1.1.1'

پس از افزودن کد فوق باید مجوز استفاده از اینترنت را دریافت کرد بنابراین ابتدا در manifest کد زیر را اضافه می کنیم:

<uses-permission android:name="android.permission.INTERNET"/>

سپس باید مجوز را برای نسخه های اندروید بالای۲۴ نیز بدست آورد که این کار در کلاس MainAcitivty انجام می شود:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.INTERNET)!= PackageManager.PERMISSION_GRANTED){
        Toast.makeText(this, "مجوز نیاز است", Toast.LENGTH_SHORT).show();
    }else {
        Toast.makeText(this, "مجوز قبلا دریافت شده است", Toast.LENGTH_SHORT).show();
        requsetData();
    }
}

چنانچه مجوز دریافت شده باشد متد requestData فراخوانی می شود. قبل از فراخوانی این متد باید ابتدا آدرس سایتی که API برای هواشناسی را پشتیبانی می کند در نظر بگیریم. سایت https://api.openweathermap.org برای این منظور مناسب است. نکته ای که وجود دارد باید در این سایت ثبت نام کرد و یک APIKEY‌ دریافت نمود که رایگان است و براحتی می توانید با جستجو در سایت این کار را انجام دهید. سپس برای اطمینان از درستی آدرس، آنرا در نرم افزار postman آزمایش کنید. عکس زیر آزمایش آدرس برای دریافت کد JSON می باشد:

اطلاعات بدست آمده از آدرس فوق که برای شهر Sari می باشد به صورت زیر است:

{
    "coord": {
        "lon": 53.06,
        "lat": 36.56
    },
    "weather": [
        {
            "id": 803,
            "main": "Clouds",
            "description": "broken clouds",
            "icon": "04n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 12,
        "feels_like": 10.55,
        "temp_min": 12,
        "temp_max": 12,
        "pressure": 1025,
        "humidity": 87
    },
    "visibility": 7000,
    "wind": {
        "speed": 2.1,
        "deg": 60
    },
    "clouds": {
        "all": 75
    },
    "dt": 1606923772,
    "sys": {
        "type": 1,
        "id": 7498,
        "country": "IR",
        "sunrise": 1606879351,
        "sunset": 1606914743
    },
    "timezone": 12600,
    "id": 116996,
    "name": "Sari",
    "cod": 200
}

اطلاعاتی که مورد نیاز است شامل نام شهر name، نام کشور که در json object با نام sys قرار دارد و نام آن country است. همچنین دما که در json object با نام name قرار دارد که رشته آن temp است. برای آب و هوا نیز در json Array با نام wheather است که در اندیس ۰ آرایه قرار دارد و رشته آن main , description است. با کمی دقت در کد JSON فوق متوجه خواهید شد.

حال رشته URLرا به صورت زیر به صورت عمومی به اندروید استودیو اضافه می کنیم:

public static final String URL_FORMAT="https://api.openweathermap.org/data/2.5/weather?q=%s&units=metric&appid=44e44e807c21dbce14c4cbcc02723dcc";

مقدار s% که در رشته فوق مشاهده می شود دریافت نام شهر از ورودی است. اکنون وقت آن است که طراحی اکتیویتی را انجام دهیم:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/city"
        android:text="Tehran"
        android:layout_marginTop="70dp"
        android:textSize="26sp"
        android:layout_marginLeft="40dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/temp"
        android:layout_centerInParent="true"
        android:text="40"
        android:textSize="76sp"
        android:textColor="@color/colorPrimary"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/weather"
        android:layout_below="@id/temp"
        android:text="Rain"
        android:layout_centerHorizontal="true"
        android:textColor="@android:color/holo_purple"
        android:textSize="26sp"/>

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

TextView tvCity,tvTemp,tvWeather;

در متد onCreate کد زیر را می نویسیم:

 tvCity=findViewById(R.id.city);
        tvTemp=findViewById(R.id.temp);
        tvWeather=findViewById(R.id.weather);

حال برای دریافت اطلاعات و نمایش در اکتیویتی متد RequestData به صورت زیر تعریف می شود:

همانطوریکه مشاهده می شود ابتدا نام شهر دریافت می شود و در رشته قرار می گیرد:

 String url=String.format(Locale.getDefault(),URL_FORMAT,"Sari");

سپس اشیای Volley فراخوانی می شوند: ابتدا شی از کلاس JSONObjectRequset فراخوانی می شودکه دارای آرگومانهای روش دریافت اطلاعات، آدرس است. کد JSON دریافتی در response قرار می گیرد:

 JsonObjectRequest request=new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.i("TAG","response: "+response.toString());
                //Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show();
                try {
                    tvWeather.setText(response.getJSONArray("weather").getJSONObject(0).getString("main"));
                    tvWeather.append(": "+response.getJSONArray("weather").getJSONObject(0).getString("description"));

                    tvCity.setText(response.getString("name").toUpperCase()+", "+ response.getJSONObject("sys").getString("country"));

                    double temp=response.getJSONObject("main").getDouble("temp");
                    tvTemp.setText(temp+"");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("TAG", "onErrorResponse: Error");
            }
        });

برای دریافت اطلاعات نیز باید از کلاس RequestQueue استفاده کرد. و متد add این کلاس درخواست را دریافت کرده و در response می چیند:

RequestQueue queue= Volley.newRequestQueue(this);
 queue.add(request);

حال برنامه را اجرا می کنیم. چنانچه مجوز اینترنت دریافت شده بود و خطایی مشاهده نکردید باید اکتیویتی به شکل زیر را ببینید: