دوره مجازی اندروید (جلسه 16): گرفتن آخرین اخبار از سرور php



visibility  
mode_comment   ۱۲۹

به نام خدا، سلام، در جلسه قبلی یک api service با php ایجاد کردیم که می توانستیم از طریق آن پست های حدید داخل پایگاه داده ذخیره کنیم و با فرمت json به کاربر برگردانیم. در این جلسه قصد داریم پست های ایجاد شده در سرور را داخل اپ نمایش دهیم.

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

 

  • اضافه کردن فایل جدید برای برگرداندن پست های سرور به اپ
  • دریافت اطلاعات از سرور با volley
  • نمایش اطاعات داخل صفحه آخرین اخبار
info توجه

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

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

comment دیدگاه کاربران
ali derakhshan replyپاسخ

با سلام فکر کنم جلسه شانزدهم باشه پانزدهم قبلا ارائه شده است

سعید شاهینی

سلام، بله ممنون تصحیح شد.

milad boos replyپاسخ

با سلام
استاد لطفا مبحث لیست بی پایان رو داخل یک قسمت توضیح بدین
ممنون میشم

سعید شاهینی

سلام، توی سرفصل ها نیست ولی راجع بهش صحبت خواهم کرد.

milad boos

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

مجید زارعی هوشیار replyپاسخ

سلام
استاد شاهینی خسته نباشید
من به یه اررور بر خوردم اونم در تابع getPosts داخل حلقه for در کلاس ApiService در کد زیر:
JSONObject jsonObject=response.getJSONObject(i);
به شمارنده i خطا میگیره ……

سعید شاهینی

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

مجید زارعی هوشیار

سلام …ممنون استاد شاهینی
درست به چیزی که شک میکردم و دقت نمیکردم …..واسه خودمم سوال بود جوابی که از سورس php گرفتم به صورت آرایه هستش چرا من ObjectReqest ایجاد کردم ولی بهش اعتنایی نمیکردم….وحتی کد های شما رو فقط داخل for کپی کردم گذاشتم باز دیدم اررور میده تااینکه شما به نکته خوبی اشاره کردید
تشکر از راهنمایی و پاسخ تون….لایک دارید 🙂

ali rahmanian replyپاسخ

سلام
استاد روند انتشار کلاس ها شده هفته ای یک جلسه حدودا یک ساعته که خیلی کنده،اینطوری خیلی از مطالب مهم فکر نمیکنم گفته بشه،من واقعا فکر میکنم اگه قرار باشه فقط مطالب عمومی اندروید رو بگید اینم به این کندی خیلی ناراحت کننده باشه،انتظار ما از دوره صفر تا صد اندروید یه دوره کامل هستش با جزییات،خیلی مطالب جالب و مورد نیاز من حس میکنم انگار قصد گفتنشو ندارید،مثلا من از چندین آموزشگاه سوال کردم مطلبی مثل کار با سخت افزار و سنسور و پرداخت درون برنامه دارن تو دوره مقدماتی اندروید درس میدن ولی تو سرفصل شما نیست،طرز بیان عالی و خوبی دارید و ما هم میخوایم از دانش شما حداکثر استفاده انجام بدیم،خواهش میکنم جلسات منظمتر و سریعتر بشن و واقعا کلیه مطالب گفته بشه…اگه هم میخواید تو چند دوره مطالب بگید لطفا بگید چه نقشه راهی دارید…با تقدیم شایسته ترین احترامات

سعید شاهینی

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

Mr abbas replyپاسخ

بوتیک 😐 هم میزارین ادامشو؟(کامل کردنشو)

سعید شاهینی

سلام، بله کامل می شن تمام صفحات

Amirhosein karimi replyپاسخ

سلام استاد , این مسیر فایل من هست اما کار نمیکنه واسه خوندن دیتا http://localhost:81/xampp/index.php

سعید شاهینی

سلام جناب کریمی، باید به جای localhost، آی پی رو وارد کنید تا کار کنه.

Amirhosein karimi

چه آی پی ؟ و از کجا آی پی پیدا کنم

سعید شاهینی

آی پی کارت شبکتون جناب کریمی

Amirhosein karimi replyپاسخ

بعد استاد سوال بعدی که این ارورو میگیرم , فیلتر شکن هم بازه
Error:Failed to find: com.android.volley:volley:1.0.0
Open FileOpen in Project Structure dialog

سعید شاهینی

یک اسکرین شات از صفحه build.gradle و پنجره ی android monitor که ارور رو نشون بده برام بفرستید.

Amirhosein karimi

http://uupload.ir/files/u6h_gr.jpg اینم عکس ارور

سعید شاهینی

جناب کریمی، فیلتر شکن psiphon خیلی ضعیف هست و جواب گو نیست،به همین دلیل نمی تونه volley رو دانلود کنه! از kerio یا cisco باید استفاده کنید.

Amirhosein karimi

مرسی استاد

جعفر پیشدادی replyپاسخ

با سلام اگر یک منبع خوب وساده وعملی برای گرفتن داده های xml معرفی کنید ممنون میشوم

وحید صالحی

http://www.w3schools.com/xml/default.asp

جعفر پیشدادی replyپاسخ

با سلام وتشکر منطورم در برنامه نویسی اندروید بود چون در این دوره با jsonکار شد میخواستم نمونه ای ساده وبروز از دریافت وبکارگیری داده xmlدر اندروید بهم بدید

سعید شاهینی

سلام جناب پیشدادی، این سایت رو مشاهده بفرمایید:
https://developer.android.com/training/basics/network-ops/xml.html
http://www.tutorialspoint.com/android/android_xml_parsers.htm
در مورد parse کردن xml توی اندروید هست. با vpn متصل بشید چون تحریم هستیم.
برای پیاده سازی سمت سرور با php لینک زیر رو مشاهده بفرمایید:
http://stackoverflow.com/questions/9152176/convert-an-array-to-xml-or-json

جعفر پیشدادی

یا سلام برای فراخوانی و نمایش داده ها از طریق ادرس xml به مشکل برخوردم فایله را براتون ایمیل کردم ..لطفا پاسخ دهید

سعید شاهینی

سلام، باشه پاسخ رو ایمیل می کنم.

Saeed Rezaei replyپاسخ

سلام،
من در اکتیویتی اصلی برای دیدن اطلاعات ArrayList از کد زیر استفاده میکنم:

و خروجی Logcat:
[com.example.saeed.myapplication.Post@942a698, com.example.saeed.myapplication.Post@1b36ef1, com.example.saeed.myapplication.Post@499dad6, com.example.saeed.myapplication.Post@db39157]

چطوری می تونم اطلاعات درون این لیست رو نمایش بدم، مثلا فیلد عنوان پستی با id چهار.

سعید شاهینی

اگه بخواید که تمامی آی دی ها رو لاگ بگیرید، یه حلقه درست می کنید، که از پست اول تا آخر رو طی می کنه و کد زیر رو داخل حلقه می گذارید.
Log.i(TAG, "onReceived: "+posts.get(i).getId());

Saeed Rezaei replyپاسخ

دو سوال داشتم:
1: راهی نیست که دادها را بطور مستقیم از دیتابیس روی سرور خواند؟
2:اگه بانک روی سرور دارای رکوردهای زیادی باشه، {مثلا پست های سال 2000 تا 2016} چطوری می تونیم از داخل آپ کویری بزنیم برا نمایش رکوردهای دلخواه!؟ چونکه الان تمام رکوردهای جدول تبدیل به جی سون میشه و کد مربوط به این قسمت هم درون فایل های php سرور نوشته شده اند.

سعید شاهینی

1- منظورتون از مستقیم چی هست؟
2- کافیه که رکوردهای مورد نظرتون رو با query فیلتر کنید، به دلیل اینکه این دوره مربوط به آموزش سمت سرور نیست، به طور کامل نمی شد همه مطالب مربوط به mysql آموزش داده بشوند.

رامین رامین replyپاسخ

سلام
چرا برای کارهای زمان بر مثله دریافت از سرور و کار با دیتابیس از ترد استفاده نشده؟ تو ویدئوهای آموزشی هر دو مبحث ندیدم از ترد استفاده کنید ایا دلیل خاصی داره؟
سوال دوم اینکه وقتی از ترد استفاده کنیم نیازی هست retry policy رو set کنیم؟
😳 با تشکر

سعید شاهینی

سلام، کتابخونه ی volley که استفاده کردیم خودش دریافت اطلاعات رو می بره روی Thread دیگه و بعد از اون پاسخ رو داخل main thread برمی گردونه، برای کار با دیتابیس از thread استفاده کردیم در جلسات مربوطه که می تونید مشاهده کنید.

Hamidreza Karimi replyپاسخ

سلام .
من وقتی وقتی می خوام اطلاعات رو پارس کنم volly پارس ارور میده
هر کاری می کنم درست نمیشه . حتی کد هارم با مال شما جا به جا کردم ولی درست نشد
ارور اینه
onErrorResponse: com.android.volley.ParseError: org.json.JSONException: Value <script of type java.lang.String cannot be converted to JSONArray

سرورم لوکال نیست و از هاست دارم استفاده میکنم

کیوان علی محمدی

دیتایی که دارین به JSON Parser ارسال می کنید از نوع string هستش و اطلاعات json معتبر داخلش نیست. احتمالا سرور خطایی داره که اطلاعات رو اشتباه میفرسته یا فرمت اطلاعات ارسالی صحیح نیست.

سیروان replyپاسخ

سلام
استاد فکر کنم برای پیاده سازی پورژه باید فایل لایوت هم یک اکتیویتی باز میکردید نه در ویدیو به چنین چیزی اشاره کرده است و نه چنین چیزی آپود شده است در قسمت فایل جلسه 15
منظورم اینه که فقط کد های جاوا هست xmlنیست .

سعید شاهینی

سلام، سوالتون متاسفانه واضح نیست. منظورتون اینه که فایل xml مربوط اکتیویتی رو آپلود نکردم؟

سیروان

بله منظورم همین است .

سعید شاهینی

داخل جلسه ی 15 آموزش سمت سرور هست و آموزشی مرتبط به اندروید داده نشده. جلسه ی 16 در مورد اندروید آموزش داده شده که فایل های مربوط به اکتیویتی ها و کلاس ها داخلش قرار داده شده.

nityou

خیر در جلسه 16 اپلود نکردید.فیل های اکتیویتی رو
ازتون خواهش میکنم لطفا لطفا فایل ها رو آپلود کنید.

سعید شاهینی

سلام، فایل مربوط به اکتیویتی جلسه 16 آپلود شد، البته اسمش عوض شده که داخل فایل Readme نوشتم

mehdi eslami replyپاسخ

سلام ممنون از آموزشتون خیلی کاربردی بود فقط یک سوال
شما در این قسمت در یک لیست 6 تا ستون از سمت سرور بر میگردونید که دارای عکس و … می باشد
حالا من میخوام هر یک از این ستون ها رو با کلیک بر روی آن داخل یک لایوت دیگه نمایش بدم .
مــثل برنامه آخرین اخبار که وقتی روی اون کلیک میشه خبر ها رو به صورت کامل نمایش میده
این روش به چه صورته؟
تشکر

سعید شاهینی

سلام، موضوعی که مد نظر شما هست، داخل جلسات بعدی کامل آموزش داده شده. دقیقاً شبیه موردی که فرمودید.

سید فاضل سدره نشین replyپاسخ

سلام ممنون از اموزش خوبتون
با وجود تغییر در localhost بازهم تصاویردر ایمولایتور نشون نمیده میخواستم ببینم مشکل از کجاست ؟؟؟؟

سعید شاهینی

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

Ali Movahedi replyپاسخ

سلام

این آموزشی که دادین برای تعداد محدود داده بود
اما معمولا هزاران دیتا در سرور وجود داره و نمیشه یک باره همرو اورد و داخل ریسایکل ویو قرار داد
میخواستم ببینم چطور میشه کاری کرد که وقتی کاربر در ریسایکل ویو اسکرول می کنه به مرور اطلاعات از سرور دریافت شه و لود شه دقیقا مثل اینستاگرام

سعید شاهینی

سلام، این مبحث رو در جلسات آتی آموزش خواهم داد.

Ali Movahedi

دقیقا در کدام جلسه آموزش میدید؟

سعید شاهینی

جلسه 39

mehdi eslami replyپاسخ

سلام وقتتون بخیر من چند روزه دچار یک مشکلی شدم هر کاری کردم نتونستم درست کنم
مجبور شدم به شما رو بندازم

تو این بخش شما توضیح دادید که چطور اخرین اخبار رو برگردونم
ولی من در api service دو تا مقدار رو بر میگردونم یکی خبرها و یکی کامنت ها

مشکل من اینه نمیتونم توی postsActivity هر دو مقدار رو بگیرم
اگه هر دو بخش رو بذارم فقط یک بخش رو داخل recyclerView بر می گردونه
(عکس رو ببینید متوجه میشید منظورم چیه)
http://fandough.ir/posts.jpg
لطفا بهم بگید چطور هر دو بخش رو به postActivty برگردونم
متشکرم.

سعید شاهینی

سلام، شما نباید هم نظرات و هم پست ها رو داخل یک لیست نمایش بدید این کار از هر لحاظ اشتباهه. باید زمانی که کاربر داخل صفحه ی پستی شد، یه دکمه بگذارید به نام مثلاً مشاهده نظرات. بعد داخل صفحه نظرات یک recycler view قرار بدید و اونجا نظرات نمایش بدید.

mehdi eslami replyپاسخ

سلام وقتتون بخیر
من میخوام برای هر پست دریافت کامنت هم بزارم (هر دو داخل یک اکتیویتی باشند)چطور این کار ممکنه؟

سعید شاهینی

سلام، متوجه منظورتون نشدم، یعنی کاربرا بتونند داخل صفحه ی پست به پست نظر بدن؟

mehdi eslami

سلام
بله منظورم همینه

سعید شاهینی

سلام، خب این که کاری نداره، یک EditText استفاده می کنید، که نظر کاربر رو دریافت کنه، بعد متن نظر و UserId کاربر رو به سرور ارسال می کنید و داخل دیتابیس ذخیره می کنید.

mehdi eslami

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

سعید شاهینی

سلام، تماس بگیرید راهنمایی تون می کنم.

Ali Movahedi replyپاسخ

یک سوال دیگه

اینکه فرض کنید یک پست دارای اطلاعاتی مثل تعداد لایک – تعداد نظرات – عکس کاربری که پست رو منتشر کرده و … هست
و بر گرفتن هر کدوم از این اطلاعات باید موقع لود یک پست در onbindviewholder یک request به سرور داد و اطلاعات رو گرفت

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

سعید شاهینی

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

iranianseda replyپاسخ

من دقیقا ماننده آموزش شما جلو رفتم ولی چیزی نشون نمی ده وقتی پروژه رو ران می کنم.
حتی از فایل های پروژه شما هم استفاده کردم نشد.
فقط در لاگ کت متن زیر رو می زنه:
ClothsAdapter clothsAdapter = new ClothsAdapter(getContext(), DataFakeGenerator.getClothes(getContext()));
11-25 09:44:58.497 20837-20837/iran.maleki.test E/RecyclerView: No adapter attached; skipping layout
11-25 09:44:58.507 20837-20837/iran.maleki.test E/RecyclerView: No adapter attached; skipping layout
11-25 09:44:58.517 20837-20837/iran.maleki.test I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@35d4902 time:230505634
بی زحمت ایمیلتون رو هم بگید استاد.
ممنون بابت آموزش های خوبتون

سعید شاهینی

سلام، این اروری که می ده می گه Adapter رو ست نکردید!
باید بنویسید:
recyclerView.setAdapter(clothsAdapter);

iranianseda

همه چیز رو درست زدم. از کد خود شما استفاده کردم ولی باز هم خطای میده
11-25 09:44:58.507 20837-20837/iran.maleki.test E/RecyclerView: No adapter attached; skipping layout

سعید شاهینی

سلام پاسخ رو براتون ایمیل کردم

علی رضایی

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

11-25 09:44:58.497 20837-20837/iran.maleki.test E/RecyclerView: No adapter attached; skipping layout

سعید شاهینی

این ارور تنها چیزی که می گه اینکه آداپتر رو ست نکردید. لطفا این مورد رو چک کنید.

Rabbit94 replyپاسخ

استاد برا منم دقیقا همین ارور رو میده
No adapter attached; skipping layout
onErrorResponse: com.android.volley.TimeoutError

سعید شاهینی

سلام، timeout error یعنی نتونسته به سرورتون متصل بشه.

امیررضا رحیمی replyپاسخ

سلام استاد
اپ ارور فورس کلوز میده
همچنین
این ارور ها رو میده
12-09 15:55:41.342 20688-20688/? E/RecyclerView: No adapter attached; skipping layout
12-09 15:55:41.362 20688-20688/? E/AndroidRuntime: FATAL EXCEPTION: main

سعید شاهینی

سلام، اسکرین شات کاملی از اررور ثبت بکنید که بشه متوجه شد مشکل چیه

niksaz replyپاسخ

من نمیتونم ip اپ تاپمو پیدا کنم.فکر کنم شما در آموزشتون توی مرورگر گوگل کروم ادرس ip رو بدست اوردین. امکانش هست روش پیدا کردنش رو بهم بگید؟

سعید شاهینی

سلام از این لینک استفاده کنید.

niksaz replyپاسخ

سلام استاد.
من تمامی قسمت ها رو همراه شما جلو رفتم. اما در اندروید مانیتور این ارور رو میده:
Unexpected response code 403 for http://192.168.1.56/7learn/getposts.php
مشکل از کجاست؟ اینترنتم وصل هست تما به دیتابیس متصل نمیشه

سعید شاهینی

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

elham rezaiy replyپاسخ

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

سعید شاهینی

سلام٬ پاسخ رو ایمیل کردم

Hamid Reza Khavarie replyپاسخ

سلام استاد
چیزی که من متوجه شدم از مشاهده جلسه 14 و 16 ما دو حالت JsonRequest داریم ، در جلسه 14 شما حالت JsonObjectRequest را توضیح دادید و در جلسه 16 JsonArrayRequest و اینکه در جلسه 16 شما پست ها را از سمت سرور که دریافت می کنید به RecyclerView ارسال می کنید.
سوال اول : آیا استفاده از JsonArrayRequest با JsonObjectRequest فرقی دارد یا حتما باید وقتی [ ] شروع شد باید از JsonArray استفاده کرد و زمانی که {} شروع شد باید از حالت دوم استفاده کرد؟
لینک
http://www.payamrasa.com/json.php?n=10
لینک بالا باید از JsonObject استفاده کرد ؟
سوال 2 : من برای دریافت لینک بالا به اینصورت عمل کردم

ولی یک مشکل کلاس LastNewsActivity در بخش

در بخشی که post را پاس می دهیم ارور میدهد و نیاز به یک ArrayList از نوع post نیاز دارد .
می خواستم بدانم چگونه می توان یک ArrayList در متد parseResponseToPost ایجاد کرد.

سعید شاهینی

سلام٬
پاسخ سوال اول: بله زمانی که Response شما دارای والد یا Parent از نوع آرایه [] باشد باید از JsonArrayRequest استفاده کنید و اگر {} باشد از JsonObjectRequest.
پاسخ سوال دوم با مثال:

public void getPosts(final OnPostsReceived onPostsReceived){
JsonArrayRequest request=new JsonArrayRequest(Request.Method.GET, "http://192.168.1.104/7learn/getposts.php", null, new Response.Listener() {
@Override
public void onResponse(JSONArray response) {
List posts=new ArrayList<>();
for (int i = 0; i < response.length(); i++) { Post post=new Post(); try { JSONObject jsonObject=response.getJSONObject(i); post.setTitle(jsonObject.getString("title")); post.setId(jsonObject.getInt("id")); post.setContent(jsonObject.getString("content")); post.setPostImageUrl(jsonObject.getString("image_url")); post.setDate(jsonObject.getString("date")); posts.add(post); } catch (JSONException e) { e.printStackTrace(); } } onPostsReceived.onReceived(posts); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, "onErrorResponse: "+error ); } }); request.setRetryPolicy(new DefaultRetryPolicy(18000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); Volley.newRequestQueue(context).add(request); }


public interface OnPostsReceived{
void onReceived(List posts);
}

پوریا صیامی replyپاسخ

با سلام
من بجای php از asp.net استفاده کردم.
خروجی json من به صورت زیر میباشد

[{“PostId”:1,”PostName”:”ری شمالی”,”PostUrl”:”http://192.168.1.4/images/post/1.jpg”},{“PostId”:2,”PostName”:”نمایشگاه”,”PostUrl”:”http://192.168.1.4/images/post/2.jpg”},{“PostId”:3,”PostName”:”سعیدیه”,”PostUrl”:”http://192.168.1.4/images/post/3.jpg”},{“PostId”:4,”PostName”:”منتظر قائم (سیکل ترکیبی)0″,”PostUrl”:”http://192.168.1.4/images/post/4.jpg”},{“PostId”:5,”PostName”:”دوشان تپه”,”PostUrl”:”http://192.168.1.4/images/post/5.jpg”},{“PostId”:6,”PostName”:”بیسیم کمال آباد”,”PostUrl”:”http://192.168.1.4/images/post/6.jpg”},{“PostId”:7,”PostName”:”جمکران (قم3 )0″,”PostUrl”:”http://192.168.1.4/images/post/7.jpg”},{“PostId”:8,”PostName”:”سد طالقان”,”PostUrl”:”http://192.168.1.4/images/post/8.jpg”},{“PostId”:9,”PostName”:”شهرک راه آهن”,”PostUrl”:”http://192.168.1.4/images/post/9.jpg”},{“PostId”:10,”PostName”:”اندیشه”,”PostUrl”:”http://192.168.1.4/images/post/10.jpg”},{“PostId”:11,”PostName”:”فراز”,”PostUrl”:”http://192.168.1.4/images/post/11.jpg”},{“PostId”:12,”PostName”:”ازگل”,”PostUrl”:”http://192.168.1.4/images/post/12.jpg”},{“PostId”:13,”PostName”:”زیاران”,”PostUrl”:”http://192.168.1.4/images/post/13.jpg”},{“PostId”:14,”PostName”:”فیروزکوه 63″,”PostUrl”:”http://192.168.1.4/images/post/14.jpg”},{“PostId”:15,”PostName”:”سیار زرین کوه (دماوند)0″,”PostUrl”:”http://192.168.1.4/images/post/15.jpg”},{“PostId”:16,”PostName”:”صادقیه”,”PostUrl”:”http://192.168.1.4/images/post/16.jpg”}]

به error زیر برخورد کردم :
onErrorResponse: org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONArray

میشه راهنمایی کنید منو؟

سعید شاهینی

سلام خروجی سرور شما Json ای هست که داخل یک رشته قرار داره. به همین دلیل اررور می ده می گه نمی تونه String رو به JsonArray تبدیل کنه، فقط کافیه که سمت سرور به جای Json رو از String خارج کنید.

مختار اسمعیلی replyپاسخ

سلام و خسته نباشید.
استاد یک سوال داشتم .
مندر دیتابیس یک ستون به نام موضوع هم اضافه کردم. چطور میتونم لیست مطالب هر موضوع رو در اکتیویتی جدا داشته باشم. برای مثال LastNewsActivity و LastPostActivity که هر دو دریک تیبل دیتابیس هستند و فقط موضوعشان متفاوت هست. ممنون میشم راهنمایی کنید

سعید شاهینی

سلام، خیلی ساده اس! شما فرض کنید دو موضوع مختلف دارید به نام های X و Y. داخل صفحه X به دیتایس بگید که فقط سطرهای که موضوعشون X هست برگردون. و در صفحه Y هم به همین ترتیب

sina replyپاسخ

سلام من دقیقا کارایی که شما گفتین کردم ولی وقتی ران میکنم هیچی نمیاره و صفحه خالی نشونم میده. این ارور هم میده. چکار کنم؟

03-18 14:44:19.221 24056-24056/com.example.thispc.sinare E/RecyclerView: No adapter attached; skipping layout

سعید شاهینی

سلام٬ این ارور می گه هنوز آداپتری روی RecyclerView ست نشده.

sina

چطوری ست کنم؟

سعید شاهینی

با متد recyclerView.setAdapter. داخل ویدیو توضیح دادم.

sina

دقیقا همونایی که نوشتید هم کپی میکنم بازم نمیشه

سعید شاهینی

کلاسی که RecyclerView رو داخلش قراردادید و آداپتر رو روش ست کردید برام ایمیل کنید.

sina

چهار روزه ایمیل زدم. لطفا چک کنید

سعید شاهینی

سلام،ایمیلتون رو پیدا نکردم. لطفا تماس بگیرید

مختار اسمعیلی replyپاسخ

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

amir.ramin76 replyپاسخ

سلام
تاریخ ها بصورت 000-00-00 نشان داده می شوند، مشکل از کجاست؟
تشکر

سعید شاهینی

سلام. سمت سرور یا سمت کلاینت؟

amir.ramin76

سمت سرور

سعید شاهینی

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

علی رضایی replyپاسخ

سلام استاد لطفا ایمیلتون رو چک کنید

سعید شاهینی

سلام با چه ایمیلی سوال پرسیدید. البته می تونید برای سریع تر به جواب رسیدن تماس بگیرید

ح حسین replyپاسخ

سلام
فرض کنید میخوایم اخباری که هر روز میخونیم در سمت کلاینت کش بشه و روز بعد اگه اخبار جدید به سایت اضافه نشده بود از همون اطلاعات کش شده استفاده کنه . که به مرور زمان روی سرعت خیلی تاثیر داره .
برای کش کردن اطلاعات سمت کلاینت چه پیشنهادی میدین ؟
روش شما بطور کلی برای سناریوهای مختلف برای کش کردن اطلاعات سمت کلاینت چی هست ؟
از کتابخانه خاصی باید استفاده کنم ؟
نحوه کار به چه صورتی هست ؟
لطفا توضیح کامل بدین
ممنون

کیوان علی محمدی

سلام دوست عزیز. پیشنهاد میشه اطلاعات رو در دیتابیس sqlite ذخیره کنید و در هر بار اتصال به اینترنت اطلاعات در sqlite رو با اطلاعات سرور sync کنید.بستگی به مقدار کش هم داره یه چه مقدار از داده ها رو بخواید کش کنید اگه مقدارش کم باشه می تونید از فایل های عادی برای کش هم استفاده کنید.دیتابیس Realm رو هم می تونید یک بررسی کنید.

ح حسین

با سلام خدمت استاد عزیز
ممنونم
آیا لینکی یا مثالی در مورد نحوه sync بین سرور و لوکال دارید ؟ تا بهتر متوجه بشم.

کیوان علی محمدی

برای این کار فکر کنم باید از Sync Adapter خود اندروید استفاده کنید که کدهای شما برای sync شدن سرور و آپ رو مدیریت میکنه. در این لینک مستندات خود آندروید بیشتر توضیح داده.

ح حسین replyپاسخ

یکی نیست جوابگو باشه ؟؟؟
به خود آقای آوند هم ایمیل زدم جواب نمیدن !
آیا این درسته ؟
اگه نمیتونید مدیریت کنید تعداد کاربران رو ، خب چرا برای ثبت نام محدودیت نمیگذارید !

کیوان علی محمدی

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

ح حسین replyپاسخ

این لحاظ شرعی و عرفی و قانونی درسته برای جواب یک سوال بنده یک هفته معطل باشم ؟

کیوان علی محمدی

بابت تاخیر واقعا عذرخواهی میکنیم. بعضا برای مدرس مشکلی پیش میاد که باعث تاخیر در جواب دادن سوالا میشه.

313iman313 replyپاسخ

سلام یعنی لازمه برای برنامه نویسی اندروید php هم بلد باشیم ؟!؟؟! چون من پایتون بلدم وب سایت شخصی خودم رو هم با پایتون نوشتم حالا باید چه کرد ؟ لطفا یه جواب کامل به بدید مرسی اه

سعید شاهینی

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

nikta replyپاسخ

سلام
استاد من دقیقا کدهای شما رو توی برنامم دارم اما باز هم ارورهای زیر رو میده
07-21 13:01:36.031 5296-5296/com.nikta.nn.a7learn E/RecyclerView: No adapter attached; skipping layout
07-21 13:02:14.969 5296-5296/com.nikta.nn.a7learn E/ApiService: onErrorResponse: com.android.volley.NoConnectionError: java.net.ConnectException: Connection refused

اداپتر هم ست کردم اما درست نشد.
ممنون میشم اگر لطف کنید و راهنمایی کنید خیلی وقته روی این گیر کردم.

سعید شاهینی

سلام، مشکل این هست که دستگاه اندرویدی که دارید روش تست می کنید آدرس سرور شما رو پیدا نمی کنه

سعید شاهینی replyپاسخ

سلام، شماره پورت رو آخر آدرس url اضافه کنید. مثلا 172.16.1.63:3000

علی خاکساری replyپاسخ

سلام استاد من پورت رو تغیر دادم ولی باز هم چیزی نشون نمیده تو برنامه
از قسمت های مختلف لاگ گرفتم تو کلاس ApiService در متد getPost یه لاگ مثل خط زیر گرفتم و تو لاگ این پیغام رو داد

LISTAPP: default retry policy [ ] http://192.168.1.7:88/newdatabase/getpost.php 0x355f91b NORMAL null

این صفحه ی getpost.php رو هم که خودم تو مرورگر اجرا میکنم درست اجرا میشه و آرایه ها رو از دیتا بیس بهم نشون میده
همیچین خروجی داره

[{“id”:”111″,”title”:”ali”,”content”:”hamidi”,”image_url”:”http:\/\/localhost:88\/newdatabase\/ghab.jpg”},{“id”:”4156″,”title”:”mohamad”,”content”:”rezayi”,”image_url”:”http:\/\/localhost:88\/newdatabase\/jadval.jpg”}]

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

request.setRetryPolicy(new DefaultRetryPolicy(18000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
		
		Log.d("LISTAPP", "default retry policy " + request.toString());


سعید شاهینی

سلام وقت بخیر، شما باید یک breakpoint داخل متد onResponse و onError بگذارید و اونجا چک کنید که مشکل از کجاست. این لاگی که الان گذاشتید عملا هیچ کمکی نمی کنه

فردین عباسی replyپاسخ

سلام استاد
عکسها رو تو پایگاه داده آپلود کردم ولی وقتی اندروید استودیو رو اجرا میکنم همه نوشته ها رو بالا میاره جز عکسا
هم با کدهای خودم امتحان کردم هم با کدهایی که شماگذاشته بودید
ممنون میشم راهنماییم کنید

فردین عباسی

مجددا سلام استاد
این error رو میده

08-11 14:42:36.226 4075-4075/com.example.developer.myapplication E/RecyclerView: No adapter attached; skipping layout
08-11 14:42:36.817 4075-4075/com.example.developer.myapplication E/ApiService onErrorResponse: com.android.volley.NoConnectionError: java.net.ConnectException: failed to connect to /192.168.1.100 (port 80) after 18000ms: isConnected failed: ECONNREFUSED (Connection refused)
سعید شاهینی

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

فردین عباسی replyپاسخ

سلام استاد وقتتون بخیر
ip کارت شبکه ام رو 10.0.2.2 کنم؟
یا ip برای image_url تو دیتابیس رو 10.0.2.2 کنم؟ یا باید جای دیگه ای اینکار رو بکنم؟

ip کارت شبکه ام رو 10.0.2.2 کردم
و تمام ip image_url ها دیتابیسم ام رو 127.0.0.1 کردم یعنی(127.0.0.1/7learn/uploads/pic….jpg) و تو IDE اینکار رو کردم (replace(“127.0.0.1″,”10.0.2.2” بازم تصویرا لود نشدن
تمام ip image_url ها دیتابیسم ام رو 127.0.0.1 کردم و تو ()IDE replace رو حذف کردم بازم تصویرا لود نشدن
تمام ip image_url ها دیتابیسم ام رو http://localhost کردم یعنی(http://localhost/7learn/uploads/pic…jpg) و تو IDE اینکار رو کردم (replace(“localhost”,”10.0.2.2″ بازم تصویرا لود نشدن
آخرشم
تمام ip image_url ها دیتابیسم ام رو 10.0.2.2 کردم یعنی(10.0.2.2/7learn/uploads/pic…jpg) و تو IDE اینکار رو کردم (replace(“10.0.2.2″,”10.0.2.2” بازم تصویر لود نشد یه بار دیگه ()replace رو حذف کردم بازم اتفاقی نیفتاد

ممنون میشم راهنماییم کنید

سعید شاهینی

هر ip که بخوای به localhost شما اشاره کنه باید 10.0.2.2 باشه

حانیه مطلق replyپاسخ

سلام خسته نباشید من api service دریافت کردم و طبق آموزش های شما در برنامه ازش استفاده کردم چند بار هم چک کردم کدها شبیه کدهای شما بود ولی وقتی run میکنم اکتیویتی خالی نمایش داده میشه در صورتی که از datafake استفاده میکردم نمایش می داد و اینکه نتونستم کتابخونه پیکاسورو آنلاین اضافه کنم و از روش آفلاین استفاده کردم ولی در قسمت dependencies اضافه نشد ولی تونستم از پیکاسو تو کدهام استفاده کنم میشه راهنماییم کنید که ایراد ازکجا میتونه باشه؟

سعید شاهینی

سلام وقت بخیر. باید هر جا که مشکل و یا اروری هست اسکرین شات بدید که بتونم راهنمایی کنم. اینکه از api چیزی دریافت نمی شه دلایل مختلفی می تونه داشته باشه مثل:
1. خطای سروری یا 500. یعنی به هر دلیلی مشکلی سمت سرور بوجود اومده
2. مشکلات شبکه ای. یعنی دستگاه اندروید شما نتونسته به سرور متصل بشه
3. خطای سمت کلاینت یعنی شما. ممکنه اطلاعات از سرور به درستی دریافت شده باشن ولی سمت کد شما مشکلی وجود داشته باشه
برای اینکه بدونید دقیقا مشکل شما الان چی هست بایستی از ابزار دیباگ استفاده کنید

حانیه مطلق

با کدهای php اصلا نتونستم پایگاه داده و جدول ایجاد کنم ارور not found میداد، به صورت دستی داخل phpmyadmin, پایگاه داده و جدول رو ساختم به کمک کد ها تونستم به پایگاه داده وصل بشم و api servies بگیرم و تو کدهام استفاده کنم ولی اکتیوتی خالی نشون میده، میتونه اشکال از اینجا باشه که دستی ساختم پایگاه داده رو?

سعید شاهینی

سلام، ابتدا داخل PostMan تست کنید که api درست کار می کنه یا نه، اگه اوکی بود، حتما مشکل از سمت اپلیکیشن هست و باید اپلیکیشن رو دیباگ کنید تا ببینید مشکل از کجاس

حانیه مطلق

و یه سوال دیگه اینکه ip server همون ، ip کامپیوتر خودمون میشه?یا همون 127.0.0.1 بزاریم?سرور الان اپاچی هست نه pc خودمون که بخوایم ip کامپیوتر بدیم درک نمیکنم این قسمت رو

سعید شاهینی

اگه می خواید از شبیه ساز به سرور خودتون وصل بشید، باید از آیپی 10.0.2.2 استفاده کنید.

محمد مهدی حسینی replyپاسخ

با سلام و عرض ادب
کد مربوط به این جلسه رو بطور کامل نوشتم این کد روی شبیه ساز جنی موشنم کامل و درست اجرا میشود.
اما در گوشی اندرویدی از طرف جیسون خطایی بصورت زیر برای برنامه من ارسال میشود:
com.volley.NoConnentionError:java.net.SocketException:recvform failed:ECONNRESET(Connection reset by peer)
ممنون میشم اگر بتونید دررفع این مشکل کمکم کنید.

سعید شاهینی

سلام، خب کاملا مشخصه. دلیل این مشکل این هست که گوشی شما سرور رو نمی تونه ببینه ولی شبیه ساز تونسته. دلیلش مشکلات شبکه هست. مثلا اینکه رنج آیپی گوشی و سرورتون یکی نیست.

محمد مهدی حسینی replyپاسخ

خب ،راه حلش چیه؟
هر گوشی یک ایپی مخصوص به خود داره
پس نمیتونیم همشونو پوشش بدیم.

سعید شاهینی

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

محمد مهدی حسینی replyپاسخ

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

موسوی replyپاسخ

سلام استاد من میخوام روی هاست خودم تست کنم …مشکلی پیش نمیاد ؟ (منظورم لوکال هاست نیست,یه هاست خریدم )

سعید شاهینی

سلام نه، چه مشکلی می خواد داشته باشه آخه 🙂

ارسال نظرات

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