رفتن به مطلب
انجمن اندروید ایران | آموزش برنامه نویسی اندروید و موبایل
  • android.png.1fab383bc8500cd93127cebc65b1dcab.png

بسته شدن برنامه حین اجرای AsyncTask


پست های پیشنهاد شده

باسلام خدمت همه برنامه نویسای عزیز!

یه مدته که دارم با AsyncTask کار میکنم خواستم یکی از مشکلاتم روبگم!

 

همونطور که میدونید زمانی که یه AsyncTask اجرا میشه اتصال به یک آدرس وب انجام میشه اما مشکلی باهاش مواجه هستم اینه که اگر اون فایل وجود نداشت یا یه لحظه اینترنت کاربر قطع شد کلا فرایند میره روی هوا و اپ متوقف میشه!

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

 

مرسی از همتوونننن:heart:

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در در 1397/07/16, 12:33:34، kelasend گفته است :

باسلام خدمت همه برنامه نویسای عزیز!

یه مدته که دارم با AsyncTask کار میکنم خواستم یکی از مشکلاتم روبگم!

 

همونطور که میدونید زمانی که یه AsyncTask اجرا میشه اتصال به یک آدرس وب انجام میشه اما مشکلی باهاش مواجه هستم اینه که اگر اون فایل وجود نداشت یا یه لحظه اینترنت کاربر قطع شد کلا فرایند میره روی هوا و اپ متوقف میشه!

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

 

مرسی از همتوونننن:heart:

سلام...

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

مثلا من وقتی که میخوام یکسری اطلاعات رو از سمت سرور دریافت کنم که در قالب جیسون هستن، توی متد doInBackground یک jsonObject رو طبیعتا تعریف کردم و در انتهای متد اون رو return میکنم و در نهایت در متد onPostExecute با یک if ساده چک میکنم که مقدار برگشتی null نباشه. اگر null بود که یعنی خطا داده (حالا از هر نوعی، چه قطع اینترنت باشه چه ارسال اشتباهی اطلاعات و...) و خطا رو هندل میکنیم، اگر هم null نبود که یعنی همه چیز اوکی هست...

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 4 ساعت قبل، شاهرخ جهان زاده گفته است :

سلام...

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

مثلا من وقتی که میخوام یکسری اطلاعات رو از سمت سرور دریافت کنم که در قالب جیسون هستن، توی متد doInBackground یک jsonObject رو طبیعتا تعریف کردم و در انتهای متد اون رو return میکنم و در نهایت در متد onPostExecute با یک if ساده چک میکنم که مقدار برگشتی null نباشه. اگر null بود که یعنی خطا داده (حالا از هر نوعی، چه قطع اینترنت باشه چه ارسال اشتباهی اطلاعات و...) و خطا رو هندل میکنیم، اگر هم null نبود که یعنی همه چیز اوکی هست...

سلام، منظورتون رو دقیقا متوجه نشدم اگر جواب null باشه یعنی در

onPostExecute

اگر ما کد رو داخل یه String بریزیم در حالت نبود اینترنت هم جواب null است؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 18 ساعت قبل، kelasend گفته است :

سلام، منظورتون رو دقیقا متوجه نشدم اگر جواب null باشه یعنی در


onPostExecute

اگر ما کد رو داخل یه String بریزیم در حالت نبود اینترنت هم جواب null است؟

بله، نبود اینترنت تا قبل از دریافت string باعث میشه که مقدارش null برگرده و باید در onPostExecute بررسی بشه...

باید ببینیم که با چه نوع داده ای داریم کار میکنیم، در AsyncTask چه عملی داره انجام میشه؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 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 میگیره اگر اوکی بود.

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 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

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...