مشکل در thread و دسترسی به اینترنت
درود به همه
متدهایی برای چک کردن اتصال به اینترنت وجود داره که خب خیلی هم خوب کار میکنند. اما چند وقتیه نکته ای در همین مورد برام ایجاد اختلال کرده که میخوام مطرح کنم توی انجمن:
من یه اکتیویتی دارم که کد بخشی از اون به این صورته:
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- کارکرد بد: وقتی وای فای روشنه ولی اینترنت موجود نیست (اتصال به اینترنت برقراره از نظر سخت افزاری ولی نمیشه به هیچ سایتی دسترسی داشت) در این شرایط برای چند ثانیه برنامه قفل میکنه با وجودیکه کدها داخل ترد هست. برنامه چندین ثانیه قفل میکنه و وقتی نمیتونه به سایت دسترسی داشته باشه به حالت عادی برمیگرده.
میشه راهنماییم کنید که علتش چیه ؟
مشکل شما به احتمال زیاد همونی هست که جناب 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
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .