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

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

rayacoder  11 سال پیش  11 سال پیش
+2 0

درود به همه
متدهایی برای چک کردن اتصال به اینترنت وجود داره که خب خیلی هم خوب کار میکنند. اما چند وقتیه نکته‌ ای در همین مورد  برام ایجاد اختلال کرده که میخوام مطرح کنم توی انجمن:

من یه اکتیویتی دارم که کد بخشی از اون به این صورته:

         final Handler handler = new Handler();
final Runnable r = new Runnable()
{
@Override
public void run()
{

try {

URL url = new URL("http://mehrdis.ir/webservice/");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(1000 * 2); // mTimeout is in seconds
urlc.connect();
if (urlc.getResponseCode() == 200) {
Toast.makeText(G.context, " Connected", 2000).show();
}
}
catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
};

Thread myThread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
handler.postDelayed(r, 1000);
}
});
myThread.run();

این کد به یک آدرس اینترنتی متصل میشه و اگه اتصال برقرار بشه کد 200 بر میگرده. خیلی هم عالی. کد با شرایط زیر درست یا بد کار میکنه:

1- درست: وقتی وای فای خاموشه طبیعتا چیزی برنمیگردونه.

2- درست: وقتی وای فای روشنه و و اینترنت هم موجوده  به سایت وصل میشه عدد 200 برمیگرده.

3- درست: وقتی وی فای روشنه و اینترنت هم موجوده ولی آدرس غلطه عددی برمیگرده که میگه سرور یافت نشد.

4- کارکرد بد: وقتی وای فای روشنه ولی اینترنت موجود نیست (اتصال به اینترنت برقراره از نظر سخت افزاری ولی نمیشه به هیچ سایتی دسترسی داشت) در این شرایط برای چند ثانیه برنامه قفل میکنه با وجودیکه کدها داخل ترد هست. برنامه چندین ثانیه قفل میکنه و وقتی نمیتونه به سایت دسترسی داشته باشه به حالت عادی برمیگرده.

میشه راهنماییم کنید که علتش چیه ؟

+1 0
توی کد setConnectTimeout رو برای این ست کردیم که توی 2 ثانیه مثلا اگه وصل نشد بیخیال اتصال بشه. اما خب وقتی وای فای روشنه ولی نمیتونیم هیچ سایتی باز کنیم (اینترنت موجو نیست یا اختلال داره) همون قفل کردن برنامه برای بیشتر از 10 ثانیه رخ میده (11 سال پیش)
+2 0
وقتی اینجوری میشه کلا میره رو اعصاب معلوم نیست از اکلیپسه از جاواست از ترده از API هست از گوشی هست از مودمه از ویندوزه از ISP هست :| (11 سال پیش)
0 0
@Criss آره واقعا همینطوره. من که راهی براش پیدا نمیکنم. فقط میشه به همون کانکشن تایم اوت اعتماد کرد که همونم باعث قفل شدن 2 ثانیه ای برنامه میشه. (11 سال پیش)
0 0
من شرایط حالت چهارم رو نتونستم درک کنم ، یکم بازش کن من تست کنم (11 سال پیش)
0 0
@Spirit شرایط چهارم رو با مثال توضیح میدم: اول وای فای گوشی رو روشن میکنیم. به یک مودم که امکان اتصال با وای فای رو داره وصل میشیم. به اینترنت وصل میشیم. برنامه توی چک کردن آدرس جواب میده. حالا فقط کابل تلفن رو میکشیم, یعنی اینترنت یهو قطع میشه یا مشکلی توی شبکه به وجود میاد. اگه در این حالت برنامه رو باز کنیم هنگ میکنه چون نمیدونه کجاست ! از یه طرف به وای فای وصله و متد متصل بودن به شبکه بهش میگه متصلی.... برنامه ده ثانیه هنگه و بعدش کارشو ادامه میده. واضح بود یا توضیح اضافی بدم ؟ (11 سال پیش)
+1 0
من این کارو انجام دادم، همه چی آرومه هنگی در کار نیست، البته من از AsyncTask استفاده میکنم ، timeOut هم 30 ثانیه هست، ولی با اون شرایطی که گفتی و بدون اون شرایط عرض دو سه ثانیه وضعیت رو اعلام میکنه همیشه... (11 سال پیش)
0 0
@Spirit خب من یه کم حساسم شرایط مختلفو چک میکنم چون به هر حال همچین چیزایی پیش میاد اونم با وجود اینترنت ایران چه ای دی اس ال چه اینترنتهای موبایلی. امکانش هست همین کد من رو با AsyncTask برام ویرایش کنی؟ تا امروز ازش استفاده نکرده بودم. البته یه نگاه گذرا انداختم ببینم چیه و فهمیدم تقریبا. ولی چون زیاد آشنا نیستم ممکنه خطا داشته باشم, اگه زحمتی نیست برام بنویسی تستش کنم ممنونت میشم. (11 سال پیش)
+1 0
شما تمام کار ها رو داخل handler انجام دادید به این نکته دقت کردید؟ و داخل این لینک پاسخ استاد رو همم ببینید خالی از لطف نیست :) لینک (11 سال پیش)
0 0
@DarkLord این یکی از کدهای تسم بود حالتهای مختلف درون ترد بدون هندلر، با هندلر و چیزهای دیگه هم همین مشکل رو داشت. (11 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
Spirit  11 سال پیش
+4 0

مشکل شما به احتمال زیاد همونی هست که جناب DarkLord اشاره کردن

 private class LongOperation extends AsyncTask<String, Void, Boolean> {

@Override
protected Boolean doInBackground(String... params) {

try {
URL url = new URL("http://mehrdis.ir/webservice/");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(1000 * 2); // mTimeout is in seconds
urlc.connect();
if (urlc.getResponseCode() == 200) {
return true;
} else {
result false;
}
}
catch (MalformedURLException e1) {
e1.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}

return false;
}

@Override
protected void onPostExecute(Boolean result) {
if(result)
// internet is ok
else
// no internet
}
}
+1 0
جناب Spirit جان دمت گرم. خوده خودشه. در همه حالاتی که میخواستم جواب داد. البته کدی که شما داده بودی رو یه تغییراتی دادم بهش تا به نتیجه مطلوبم برسم. سپاس ویژه (11 سال پیش)

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