دوره مجازی اندروید (جلسه 13): آموزش Json و دریافت اطلاعات از سرور با Volley

‏  1 دقیقه
۱۵ مرداد ۱۳۹۵
دوره مجازی اندروید (جلسه 13): آموزش Json و دریافت اطلاعات از سرور با Volley

به نام خدا، دوستان سلام. توی این جلسه با ساختار داده Json آشنا می شویم. Json یک ساختار برای تبادل و ذخیره سازی اطلاعات هست که امروزه بیشنر وب سایت های معتبر برای Api سرویس خود، از این ساختار استفاده می کنند. در این جلسه همچنین به کار با کتابخانه ی Volley را آموزش خواهیم داد.

به دلیل مهم بودن این بخش 2 مثال کاملا متفاوت حل خواهیم کرد، یک مثال مربوط به ساختن یک اپ آب و هوا خواهد بود که اطلاعات آب و هوای کنونی شهر خاصی را نمایش خواهد داد. و در مثال بعدی قسمت هایی که در جلسه ی مربوط به RecyclerView طراحی کردیم را با استفاده از اطلاعات سرور پیاده سازی خواهیم کرد.

مطالب مطرح شده در این جلسه عبارتند از :

  • JSON چیست؟
    • Json Object
    • Json Array
    • Json key
    • Json value
    • ایجاد JsonObject
  • دریافت اطلاعات از وب سایت و سرور راه دور با کتابخانه گوگل (Volley)
  • Volley چیست؟
    • JsonObjectRequest
    • JsonArrayRequest
    • RequestQueue چیست؟
    • آموزش اضافه کردن Request به RequestQueue
    • RetryPolicy چیست؟
    • ست کردن RetryPolicy روی Request
:: توجه

این مطلب یک جلسه از آموزش برنامه نویسی اندروید می باشد و برای مشاهده آن باید در دوره ثبت نام کنید.

ثبت نام در آموزش برنامه نویسی اندروید

چه امتیازی به این مقاله می دید؟
نویسنده سعید شاهینی

جلسات دوره

پایان زمان پشتیبانی

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

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

نیاز به لاگین

برای ارسال دیدگاه و یا پرسیدن سوال خود در این قسمت، باید در سایت لاگین شوید.

نظرات کاربران

Saeed Hoseini

سلام خسته نباشید
استاد در خطی که از RequestQueueاستفاده کردیدمتاسفانه از کلمه ی this من ارور میگیره و مینویسه این نمیتونه برای اکتیویتی شما در خواست بشه.
مرسی اگر کمک کنید.

سعید شاهینی

سلام کدتون رو برام ایمیل کنید تا ببینم مشکلش چیه

حسین غلامی

سلام استاد
من کلیه کد هایی که وارد کردین رو وارد کردم
تنظیمات مانیفس و کلاس و لایه کاملا درست زدم فیلتر شکن هم روشنه روی سایت هم اطلاعات آب و هوا رو میفرسته ولی تو اندروید استودیو
جواب نمیده و پیام زیر رو میفرسته :
WeatherSampleActivity: onErrorResponse: com.android.volley.NoConnectionError:
java.net.UnknownHostException:
Unable to resolve host “api.openweathermap.org”
No address associated with hostname

سعید شاهینی

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

Mahdi Eshghi

سلام استاد
اون قسمت api ادرس . شهر روی لندن تنظیم شده و وقتی تغییر میدم برای تهران و مشهد و … بازم یه نوع خروجی میده و عملا هیچ کاری نمیکنه فقط یک خروجی ثابت داره برای هر شهری که بدی !
تو سایتش نوشته این فقط یک مثال هست و واقعی نیست !!!
میشه یک سایت خوب معرفی کنید که اطلاعاتش واقعی باشه!!
ممنون
یه بار دیگه هم نظر دادم جواب ندادین!

Mahdi Eshghi

میشه آدرس url این سایت openweathermap که خروجی جیسون برای شهر تهران رو بده
رو برام بفرستین
من هر کاری میکنم فقط یه خروجی اونم تز شهر لندن میده!

https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22
سعید شاهینی

سلام این سایت اطلاعاتش واقعیه و مشکلی هم نداره: https://openweathermap.org/api

محمد واحدی

استاد سلام خسته نباشید
من کدم رو عین مال شما نوشتم
اما نه کد شما کار میکنه نه کد من
جالبه که نه در Log Info چیزی میاد کلا نه در Log Error
چیکار کنم بنظرتون؟
اینم همه ی کد های منه

package jsonexample.first.hamlo.jsonexample;

import android.app.VoiceInteractor;
import android.net.sip.SipSession;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button request_btn=(Button)findViewById(R.id.send_request_btn);
        request_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getCurrentWeather("Tehran");
            }
        });
    }

    private void getCurrentWeather(String cityName){
        JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(Request.Method.GET,
                "http://api.openweathermap.org/data/2.5/weather?q=London&apikey=d061e86842ea73ef089e3d9dab9a144f",
                null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.i(TAG, "onResponse: "+response.toString());
            }
        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e(TAG, "onErrorResponse: "+error.toString() );
                    }
                });

        jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(8000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        RequestQueue requestQueue=Volley.newRequestQueue(this) ;
        requestQueue.add(jsonObjectRequest);
    }
}
سعید شاهینی

سلام، مرحله به مرحله باید break point بگذارید و debug کنید ببینید مشکل از کجاس. من که با خوندن کد شما چیزی متوجه نمی شم!

محمد واحدی

با ریست کردن اندروید استودیو درست شد !
عجیب بود برنخورده بودم تا حالا به این مشکل!

حامد

سلام استاد
اگر که بخواهیم از یک CheckBoxAlertDialog اطلاعات رو به سرور ارسال کنیم به چه صورت باید کد نوشته بشه ؟
در واقع برنامه به این شکله که
یک عکس پیش زمینه یک اکتیویتی وجود داره و روی قسمت های محتلف عکس چند باتن قرار داده شده با فشردن هر باتن توسط کاربر CheckBoxAlertDialog
ظاهر میشه ,
اما من چطور آیتم هایی که انتخاب شده از طرف کاربر به سرور ارسال کنم ؟
نکته بعد اینکه برای کمتر شدن حجم برنامه , آرایه String تمام CheckBoxAlertDialog ها را در پوشه Values >> String ایجاد کردم به این دلیل که حدود 200 آیتم هستند
برای ارسال دیتا احتمالا باید همه آرایه ها را داخل اکتویتی ایجاد کنم ! که حجم برنامه بشدت بالا میره
کمک بزرگ و حیاتیِ اگر که راهنمایی بفرمایید و یا معرفی سایتی که بتونه در این مورد خاص کمک کنه
ممنونم

سعید شاهینی

https://stackoverflow.com/questions/16954196/alertdialog-with-checkbox-in-android

غلامرضا محمدی

سلام استاد عزیز بنده کار با volley رو انجام دادم بدون مشکل ولی شبیه سازی که روی sdk 19 انجام دادم کار ارسال و دریافت انجام نشد ولی روی sdk 20 به بالا درست کار میکنه . من روی شبیه سلز خود اندروید استدیو تست کردم و min sdk:16 و target sdk:26

سعید شاهینی

سلام، ربطی به min sdk نداره چون volley کار می کنه و مشکلی نداره. مشکل از جای دیگه اس، باید مرحله به مرحله دیباگ کنید تا ببینید مشکل کجاس

مهدی پاکروان

سلاممم
واقعا مرسی خیلی دوس داشتم این قسمتو
مرسی استاد من واقعا ازتون ممنونم من از تکنیک AsyncTask استفاده میکردم که خیلی پیچیده و ضعیف بود ولی این عالیه مرسی

علی غلامی

استاد درست شد ممنون

علی غلامی

سلام استاد من کتاب خونه volley گرفتم ولی همین اول JasonObjectRequest برام نمیاره خودمم تایپ میکنم error میده 😥

سعید شاهینی

سلام٬ JsonObjectRequest درسته نه jason و نکته دیگه اینکه امکان داره پروژه رو دوباره بیلد نکردید

امین عظیمی

سلام استاد. خسته نباشید.
یک سوال برام پیش اومد
تو url شهر به عنوان لندن تعریف شده، ولی شما به تابع GetCurrentWeather تهران رو دادید. نیازی نیست مشخص کنید که تهران با لندن جایگزین بشه؟

توضیحی که برای اینترفیس دادید برام خیلی زمان برد تا متوجه بشم، سطح بالا بود
تا اینکه دوستم به این صورت گفت و با یک جمله :
با اینترفیس میشه کلاسهایی ایجاد کرد که توابعش در کلاسهای دیگه قابل override شدن باشه

سعید شاهینی

سلام، چرا! اصلا داخل url باید پارامتر تابع قرار داده بشه، من برای مثال همون لندن گذاشتم توی url باشه.
interface یه قرارداد هستش که می گه هرکس می خواد منو Implement کنه باید این توابع رو پیاده سازی کنه. این ساده ترین تعریف interface هستش.