kelasend 1 ارسال شده در ۱۶ مهر ۱۳۹۷ گزارش اشتراک گذاری ارسال شده در ۱۶ مهر ۱۳۹۷ باسلام خدمت همه برنامه نویسای عزیز! یه مدته که دارم با AsyncTask کار میکنم خواستم یکی از مشکلاتم روبگم! همونطور که میدونید زمانی که یه AsyncTask اجرا میشه اتصال به یک آدرس وب انجام میشه اما مشکلی باهاش مواجه هستم اینه که اگر اون فایل وجود نداشت یا یه لحظه اینترنت کاربر قطع شد کلا فرایند میره روی هوا و اپ متوقف میشه! خیلی دنبالش بودم اما نتونستم یه کد مناسب برای جلوگیری از این مشکل پیدا کنم ممنون میشم یه راهنمایی داشته باشید! مرسی از همتوونننن نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر
شاهرخ جهان زاده 66 ارسال شده در ۲۱ مهر ۱۳۹۷ گزارش اشتراک گذاری ارسال شده در ۲۱ مهر ۱۳۹۷ در در 1397/07/16, 12:33:34، kelasend گفته است : باسلام خدمت همه برنامه نویسای عزیز! یه مدته که دارم با AsyncTask کار میکنم خواستم یکی از مشکلاتم روبگم! همونطور که میدونید زمانی که یه AsyncTask اجرا میشه اتصال به یک آدرس وب انجام میشه اما مشکلی باهاش مواجه هستم اینه که اگر اون فایل وجود نداشت یا یه لحظه اینترنت کاربر قطع شد کلا فرایند میره روی هوا و اپ متوقف میشه! خیلی دنبالش بودم اما نتونستم یه کد مناسب برای جلوگیری از این مشکل پیدا کنم ممنون میشم یه راهنمایی داشته باشید! مرسی از همتوونننن سلام... این چیزی که شما گفتید بستگی به این داره که روی چه نوع لینکی دارید با async کار میکنید... مثلا من وقتی که میخوام یکسری اطلاعات رو از سمت سرور دریافت کنم که در قالب جیسون هستن، توی متد doInBackground یک jsonObject رو طبیعتا تعریف کردم و در انتهای متد اون رو return میکنم و در نهایت در متد onPostExecute با یک if ساده چک میکنم که مقدار برگشتی null نباشه. اگر null بود که یعنی خطا داده (حالا از هر نوعی، چه قطع اینترنت باشه چه ارسال اشتباهی اطلاعات و...) و خطا رو هندل میکنیم، اگر هم null نبود که یعنی همه چیز اوکی هست... نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر
kelasend 1 ارسال شده در ۲۱ مهر ۱۳۹۷ مالک گزارش اشتراک گذاری ارسال شده در ۲۱ مهر ۱۳۹۷ در 4 ساعت قبل، شاهرخ جهان زاده گفته است : سلام... این چیزی که شما گفتید بستگی به این داره که روی چه نوع لینکی دارید با async کار میکنید... مثلا من وقتی که میخوام یکسری اطلاعات رو از سمت سرور دریافت کنم که در قالب جیسون هستن، توی متد doInBackground یک jsonObject رو طبیعتا تعریف کردم و در انتهای متد اون رو return میکنم و در نهایت در متد onPostExecute با یک if ساده چک میکنم که مقدار برگشتی null نباشه. اگر null بود که یعنی خطا داده (حالا از هر نوعی، چه قطع اینترنت باشه چه ارسال اشتباهی اطلاعات و...) و خطا رو هندل میکنیم، اگر هم null نبود که یعنی همه چیز اوکی هست... سلام، منظورتون رو دقیقا متوجه نشدم اگر جواب null باشه یعنی در onPostExecute اگر ما کد رو داخل یه String بریزیم در حالت نبود اینترنت هم جواب null است؟ نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر
شاهرخ جهان زاده 66 ارسال شده در ۲۲ مهر ۱۳۹۷ گزارش اشتراک گذاری ارسال شده در ۲۲ مهر ۱۳۹۷ در 18 ساعت قبل، kelasend گفته است : سلام، منظورتون رو دقیقا متوجه نشدم اگر جواب null باشه یعنی در onPostExecute اگر ما کد رو داخل یه String بریزیم در حالت نبود اینترنت هم جواب null است؟ بله، نبود اینترنت تا قبل از دریافت string باعث میشه که مقدارش null برگرده و باید در onPostExecute بررسی بشه... باید ببینیم که با چه نوع داده ای داریم کار میکنیم، در AsyncTask چه عملی داره انجام میشه؟ 1 نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر
kelasend 1 ارسال شده در ۲۲ مهر ۱۳۹۷ مالک گزارش اشتراک گذاری ارسال شده در ۲۲ مهر ۱۳۹۷ در 4 ساعت قبل، شاهرخ جهان زاده گفته است : بله، نبود اینترنت تا قبل از دریافت string باعث میشه که مقدارش null برگرده و باید در onPostExecute بررسی بشه... باید ببینیم که با چه نوع داده ای داریم کار میکنیم، در AsyncTask چه عملی داره انجام میشه؟ سلام من مجددا بررسی کردم؛ فکر کنم ارور نبود اینترنت قبل از onPostExecute اتفاق میفته! @Override protected void onPostExecute(String code) { if(code.equals("ok")){ progressDialog.dismiss(); }else{ progressDialog.dismiss(); Toast.makeText(G.context,"مشکلی پیش آمده است.",Toast.LENGTH_SHORT).show(); } } الآن با این کد بازم موقع نبود اینترنت ارور میده. در این کار یک شماره همراه ارسال میشه که یه سری دیتابهش پیامک بشه اما فقط شماره ارسال میشه و یه جواب ok میگیره اگر اوکی بود. نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر
شاهرخ جهان زاده 66 ارسال شده در ۲۲ مهر ۱۳۹۷ گزارش اشتراک گذاری ارسال شده در ۲۲ مهر ۱۳۹۷ در 1 ساعت قبل، kelasend گفته است : سلام من مجددا بررسی کردم؛ فکر کنم ارور نبود اینترنت قبل از onPostExecute اتفاق میفته! @Override protected void onPostExecute(String code) { if(code.equals("ok")){ progressDialog.dismiss(); }else{ progressDialog.dismiss(); Toast.makeText(G.context,"مشکلی پیش آمده است.",Toast.LENGTH_SHORT).show(); } } الآن با این کد بازم موقع نبود اینترنت ارور میده. در این کار یک شماره همراه ارسال میشه که یه سری دیتابهش پیامک بشه اما فقط شماره ارسال میشه و یه جواب ok میگیره اگر اوکی بود. یه نکته خیلی ظریف اینجا هست که اکثرا موقع کار با Async باهاش مواجه میشیم. یعنی همون نبود اینترنت و قطعی اینترنت هست. این دو با هم متفاوت هستن... نبود اینترنت به این معنی هست که کلا گوشی کاربر به اینترنت وصل نیست (یا دیتای گوشی خاموش هست یا وای فای) که در این حالت اول باید با یک کلاس مثلا isNetworkAvailable چک بکنید که اصلا اینترنت فعال روی گوشی هست یا نه، میتونه این کار به این شکل باشه: private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } و بعد در متد onCreate: public class YourApplication extends AppCompatActivity { @Override public void onCreate() { super.onCreate(); if (isNetworkAvailable()) { async.execute(); } else { //Not connected } } } در این حالت اگر اینترنت باشه که async اجرا میشه در غیر اینصورت اصلا به مرحله اجرا نمیرسه... اما حالت دوم، یعنی قطعی اینترنت، که منظور نداشتن send and receive حتی در حالتی هست که کاربر به نت وصل هستش. در این حالت async اجرا شده و در متد doInBackground قرار گرفته ولی اطلاعاتی از سمت سرور طبیعتا دریافت نمیکنه. async بعد از چند ثانیه به کار doInBackground خاتمه میده و متد onPostExecute رو صدا میزنه. ببینیم چه اتفاقی میوفته: شما یک شرط گذاشتی: if (code.equals("ok")) // همه چیز درسته این قسمت درسته و کار خودش رو میکنه، اما اگر دچار قطعی اینترنت شدی عملا مقدار code برابر با null خواهد بود، که به نظر میاد هندل شده. ولی یک "نکته" بزرگ اینجا هست... اون else داره میگه اگر مقدار code برابر هر چیز دیگه ای به غیر از "ok" و null بود، Toast بده. پس عملا null بودن code هندل نشده و باید با یک else if اون رو هندل کنید: if (code == null) // خطا رو هندل کنید else if (code.equals("ok")) //همه چیز درسته else //خطا رو هندل کنید ** یه نکته مهم هم بگم شاید گره از کار باز کنه: سعی کنید متد onCancelled رو هم پیاده سازی کنید - قبل از onPostExecute 1 نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر
kelasend 1 ارسال شده در ۲۶ مهر ۱۳۹۷ مالک گزارش اشتراک گذاری ارسال شده در ۲۶ مهر ۱۳۹۷ خیلی جواب کاملی بود ممنون! نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر
پست های پیشنهاد شده
به گفتگو بپیوندید
هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .