تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ راضیه کارگر
تبدیل volley به retrofit
پوریا شفیعی حل شده توسط پوریا شفیعی

با سلام و وقت بخیر

در یک API وقتی URL را ارسال میکنید response بازگشتی سه تا کلید داره. Success و Messages  و Data . مشابه زیر. البته تعداد item‌های Data زیاد هستند.

{
    "Success": true,
    "Messages": [],
    "Data": [
        {
            "Code": "90006",
            "Title": "اتود اونر جديد",
            "Price": "",
            "Description": "",
            "ID": 60,
            "BarCode": "880916621565388091662184498809166217282 8809166214595 ",
            "Qty": "23"
        },
        {
            "Code": "90008",
            "Title": "اتود اينوكس",
            "Price": "",
            "Description": "",
            "ID": 62,
            "BarCode": "6948684102105",
            "Qty": "0"
        },
        {
            "Code": "90020",
            "Title": "استامپ كورش",
            "Price": "",
            "Description": "",
            "ID": 74,
            "BarCode": null,
            "Qty": "0"
        }
    ]
}

 

در کلاس ApiService به کمک Volley تونستم اطلاعات را از این فایل json استخراج کنم و نمایش بدم. (عکس ضمیمه شده) در واقع data میشه همان response ای که در  فیلم‌ها توضیح داده شده و من message , success را جداکردم.

public void getProducts(int countProducts,getProductCallback callback){
        String url=baseUrl+"Product/Products?Token="+ new MyUserManager(context).getToken();
        JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
         @Override
        public void onResponse(JSONObject response) {
              Log.i(TAG, "Api service onResponse Product: OK");
              boolean success=false;
              JSONArray message=null;
              JSONArray data=null;
              try {
                    success = response.getBoolean("Success");
                    message=response.getJSONArray("Messages");
                    data = response.getJSONArray("Data");
              }
              catch (Exception e) {
                  e.printStackTrace();
              }
             if(data.length()>0){
                  List<Product> productsList=new ArrayList<>();
                  Log.i(TAG, "Api service Data : OK");
                  int countOfProducts=(countProducts<=0?data.length():countProducts); //0 =>all products
                  for (int i = 0; i < countOfProducts ; i++) {
                      try {
                          JSONObject productJsonObject   = data.getJSONObject(i);
                          Product product=gson.fromJson(productJsonObject.toString(), Product.class);
                          productsList.add(product);
                          Log.i(TAG, "Api service add product "+i);
                      } catch (JSONException e) {
                          e.printStackTrace();
                      }
                  } //end of for
                  callback.OnSuccess(productsList,null);
                  Log.i(TAG, "Api service callback productslist ");
            }
             else if(message.length()>0){
                 String msg= null;
                 msg = message.toString();
                 callback.OnSuccess(null,msg);
             }
        }
      }, new Response.ErrorListener() {
          @Override
          public void onErrorResponse(VolleyError error) {
                callback.onError(error);
              Log.i(TAG, "Api service callback Error productslist ");
          }
      });
      jsonObjectRequest.setTag(TAG + "Product");
      jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(10000,3,2));
      requestQueue.add(jsonObjectRequest);
      Log.i(TAG, "Api service add  jsonObjectRequest to requestQueue");
  }
    interface getProductCallback{
        void OnSuccess(List<Product> productsList ,String message);
        void onError(VolleyError error);
    }

در فرگمنت home هم کالاها را گرفتم.

apiService.getProducts(0,new ApiServiceVolley.getProductCallback() {
                @Override
                public void OnSuccess(List<Product> list,String message) {
                    if(list != null) {
//                        MyRemoteRepository.setProductList1(list);
                        productList1=new ArrayList<>();
                        Product product;
                        for (int i = 0; i < list.size() ; i++) {
                            product=list.get(i);
                            productList1.add(product);
                        }
//                        showRecycelViewProductList1(MyRemoteRepository.getProductList1());
                        showRecycelViewProductList1(productList1);
                    }
                    else{
                        //ToDo show message
                    }
                }
                //
                @Override
                public void onError(VolleyError error) {
                    Log.i(TAG, "onError: " + error);
                }
            });

الان سوال من این هست که میخوام volley را به Retrofit تبدیل کنم. راهکار چیه؟

 

چون data هام زیاده باید از paging۳ استفاده کنم و مجبورم Retrofit  و  rxjava را بکار ببرم. اولین کارم اینه که بتونم volley را به Retrofit تبدیل کنم. 

 

لطف کنید یه منبع اموشی کامل retrofite معرفی کنید.

 

ممنون از زمانی که برای پاسخگویی این سوال میگذارید.

 

 

سلام و احترام 

 

تمام این مباحث در دوره پوشش داده شده و شما لازم هست به ترتیب سرفصل‌ها رو ببینید تا به این هدف برسید .

 

پوریا شفیعی ۱۵ مرداد ۱۴۰۰، ۰۶:۴۲

سلام . در فیلم‌های استاد وقتی response را تحویل میگیره خودش اطلاعات دانشجویان هست. ولی در API که من دارم گفتم که سه تا کلید برمیگرده و فعلا در بخش نمایش داده‌ها از Data  استفاده میکنم. اگر در data چیزی نبود باید به message نگاه کنم.

 

در فیلم‌ها response خیلی ساده است و کل بدنه برای تبدیل به Student مناسب هست و من نمیتونم از کل response بازگشتی در Api خودم استفاده کنم.

چه طور کلیدها را در Retrofit جدا کنم. در Volley کدها را ارسال کردم. هر سه کلید را جداگانه گرفتم و بعد روی از روی Data لیست products را استخراج کردم

راضیه کارگر ۱۵ مرداد ۱۴۰۰، ۰۷:۲۹

سلام مجدد وقتتون بخیر

 

بله متوجه سوال شدم برای همین گفتم نیاز هست سرفصل‌ها رو به ترتیب ببینید تا این موارد رو یادبگیرید .

 

برای این کار پلاگین هایی وجود دارند که برامون model میسازند که باز این این مورد رو در ادامه یاد میگیرید .

 

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

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

 

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

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

 

دلیل ساده بودن جیسون در این سرفصل این هست دانشجو پله پله مطالب رو یاد بگیره تا در ادامه با مثال‌های پیچیده‌تری اشنا بشود.

public class Datum{
    @JsonProperty("Code") 
    public String code;
    @JsonProperty("Title") 
    public String title;
    @JsonProperty("Price") 
    public String price;
    @JsonProperty("Description") 
    public String description;
    @JsonProperty("ID") 
    public int iD;
    @JsonProperty("BarCode") 
    public String barCode;
    @JsonProperty("Qty") 
    public String qty;
}
public class Root{
    @JsonProperty("Success") 
    public boolean success;
    @JsonProperty("Messages") 
    public List<Object> messages;
    @JsonProperty("Data") 
    public List<Datum> data;
}
بهترین پاسخ
پوریا شفیعی ۱۵ مرداد ۱۴۰۰، ۰۸:۲۸