kelasend

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

7 ارسال در این موضوع قرار دارد

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

یه مدته که دارم با 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 چه عملی داره انجام میشه؟

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 میگیره اگر اوکی بود.

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


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

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


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

خیلی جواب کاملی بود ممنون!

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


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

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری