آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

کلاس های جایگزین

شیلا  9 سال پیش  9 سال پیش
0 0

سلام دوستان و من برنامه استاد رو در رابطه با گرفتن محتوای سایت و یا Content و تبدیل اون به جیسون JSON رو که در اکلیپس نوشته شده بود اجرا کردم اما وقتی برنامه رو به اندروید استودیو میبرم و همه ی دسترسی و پرمیشن های مربوطه رو هم به برنامه مم تو اندروید استودیو میدم برنامه یا کرش میکنه و یا اطلاعات کانتنت و یا جیسون رو نمی گیره این توضیحم بدم که میدونم کلاس های HttpClient , HttpPost , HttpResponse دپریکت شده و برای اجرا کردن و شناسایی این کلاس ها داخل ماژول اپ gradle برنامم دستور  'use library 'org.appache.http.legacy رو اضافه کردم و برنامه بدون خطا اجرا میشه اما اطلاعات درخواستی منو نمیده ولی همین برنامه داخل اکلیپس بدون هیچ خطا و مشکلی کار میکنه و خروجی استرینگ و جیسون آبجکتو بهم میده اما برنامه استاد با API 8 نوشته شده ومن میخوام برنامم از اپ کامپکت استفاده کنه و بخاطر این از api بالاتر مثل 22 یا 24 استفاده کنم 

ناگفته نماند از کلاس HttpURLConnection و سمپل کد اندرویدم استفاده کردم اما باز نتونستم از وب سرویسم اطلاعاتو بگیریم 

public class WebSiteService {
public String downloadUrl(String myurl) throws IOException {
InputStream is = null;
// Only display the first 500 characters of the retrieved
// web page content.
int len = 500;

try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(1000); /* milliseconds */
conn.setConnectTimeout(1500);/* milliseconds */
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
int response = conn.getResponseCode();

Log.i("LOG", "The response is: " + response);
is = conn.getInputStream();

// Convert the InputStream into a string
String contentAsString = readIt(is, len);
return contentAsString;

// Makes sure that the InputStream is closed after the app is
// finished using it.
} finally {
if (is != null) {
is.close();
}
}
}
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
Reader reader = null;
reader = new InputStreamReader(stream, "UTF-8");
char[] buffer = new char[len];
reader.read(buffer);
return new String(buffer);
}

} 

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

یه مشکل دیگه که بتونید راهنمایی م کنید اینه که من اصلا نمیدونم داخل اندروید استودیو Debug کنم و لاگ کت ها رو ببینم مثلا برای کد بالا که متد Downloadurl باید داخل try/catch قرار بگیره میدونم که برنامه داخل فلان خط کرش (مثلا خط conn.connect() l) کرده اما چرا وقتی ترای کچ گذاشتم برنامه باید کرش کنه چرا برنامه باید بیاد بیرون و اصلا اجرا نشه و یا با فیلتر کردن لاگ های برنامه هم برام نمایش داده نمیشه لطفا اگه اینم میدونید بهم بگید 

+1 0
سلام فک می کنم به خاطر تفاوت api ها باشه مشکلتون ولی بازم باید دید از چه ایراد میگیره یا اروری چیزی به نظرم یکم سرچ کنین - تو انجمن هم هست - و به راحتی با وولی ارتباط بگیرین از هر نوعی که می خواین چه جیسون و چه رشته خیلی کارتون رو راحت می کنه و نیازی به ترد هم نداره در مورد اون آموزش هم آقای کاشی زاده و دوستان در مورد حل مشکل اون متد که دپریکیت شده زیاد توضیح دادن - فک می کنم تاپیک دوم یا سوم (9 سال پیش)
 برای این سوال 2 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
شیلا  9 سال پیش
0 0

سلام ممنون که جواب دادید اما...

میتونید بگید که مشکل کد بالا چیه آیا جایگزین مناسبی هست برای کد برنامه استاد که دپریکت شده ؟ برنامه بالا دقیقا تو خط conn.connect خطا میگیره 

+1 0
ارور لاگ کت ندارین ازش؟ ببینیم چی میگه در کل کد استاد فقط برای یاد گیری خوبه که بدونین کار چطوری پیش میره البته منظورم این نیست که بدرد نمی خوره ها خدایی نکرده منظور اینه که هدف آموزش یاد دادن بوده کتابخونه ها خیلی دستتون رو باز می زارن و خیلی راحتتون می کنن به نظرم تلاش کنین تا با اونا کار کنین. ممکنه یه دو روزی اذیت شید ولی قطعا نتیجه بهتری در بر داره (9 سال پیش)
پاسخ به سوال 
sami  9 سال پیش
0 0

 پاسخ صحیح

سلام.

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

مشکل اینجاست،که از API 10 به بعد ،دیگه کدهای همزمان در ترد رابط کاربری کار نمی کنه.

یعنی راه حل مشکل شما اینه که باید،کد های ارتباط با سرور رو توی یه Thread جداگانه قرار بدین،البته می تونید از AsyncTask استفاده کنید.

(در حال حاضر شما دارین، کدهاتونو توی همون ترد اصلی برنامه یا همون ترد رابط کاربری،اجرا می کنید).

(Main Thread = UI Thread)

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

اگه آموزش  Thread استاد رو بلد باشین ،براحتی می تونید با استفاده از اون به جواب برسین(کافیه اون متد downloadUrl رو توی Thread صدا بزنید ).اما من پیشنهاد می کنم حتما از AsyncTask هم استفاده کنید تا کار با اونو یاد بگیرین اینجوری دیگه لازم نیست خودتونو درگیر کارای مربوط به ارتباط بین تردها بکنید(هر چند که ارتباط بین ترد ها ،کار زیاد سختی هم نیست).

اگه از کتابخانه Volley استفاده کنید،دیگه از شر کار با ترد و حتی AsyncTask خلاص میشین.چون خود این کتابخونه کدهای ارتباط با سرورو توی ترد جداگانه اجرا می کنه.فک کنم Volley از AsyncTask استفاده می کنه.

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

 


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .