چرا NetworkInfo isConnected() همیشه بدرستی کار نمی کنه؟
سلام
چرا NetworkInfo isConnected() همیشه بدرستی کار نمی کنه؟ در اندروید 2.3
بعضی وقتا TRUE بر می گردونه بعضی وقتا هم FALSE... در صورتی که به اینترنت وصل هستم و InternetBrowers ها هم کار می کنند.
این تابع منه:
// android.permission.ACCESS_NETWORK_STATE permission required.
public final static boolean isNetworkAvailable(final Context ACTIVITY_CONTEXT)
{
final ConnectivityManager _OBJ_CM = (ConnectivityManager) ACTIVITY_CONTEXT.getSystemService("connectivity");
if (_OBJ_CM != null)
{
final NetworkInfo _ARY_NI = _OBJ_CM.getActiveNetworkInfo();
if (_ARY_NI != null)
{
if (((_ARY_NI.getType() == ConnectivityManager.TYPE_WIFI) || (_ARY_NI.getType() == ConnectivityManager.TYPE_MOBILE)) && _ARY_NI.isConnected()) return true;
}
}
return false;
}
این رو تست کن :
public static boolean isNetworkAvailable(Context context){
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectivity.getActiveNetworkInfo();
boolean isConnected = info != null && info.isConnectedOrConnecting();
if(isConnected){
if(info.getTypeName().equals("WIFI") || info.getTypeName().equals("wifi")){
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo != null) {
Integer linkSpeed = wifiInfo.getLinkSpeed();
if(linkSpeed>0){
Log.i("link speed",""+linkSpeed);
return true;
}
else {
return false;
}
}
}
if(info.getTypeName().equals("MOBILE") || info.getTypeName().equals("mobile")){
return true;
}
if(info.getTypeName().equals("ETHERNET") || info.getTypeName().equals("ethernet")){
return true;
}
if(info.getTypeName().equals("BLUETOOTH") || info.getTypeName().equals("bluetooth")){
return true;
}
}
return false;
}
مرسی ولی تابع شما هم جواب نداد. اما جسارتاً:
شاید بد نباشه اگر از تابع من کمی الگو بگیری چون تابع شما ایرادات جدی داره و باید تصحیح و کمی هم بهینه سازی بشه.
1- متغیر connectivity رو داخل شرط بزارید و مطمعن بشید که NULL نیست (چون تضمینی نیست که ConnectivityManager دستگاه از نظر نرم افزاری و سخت افزاری بدون مشکل باشه یا 100% return بشه).
2- طبق گفته گوگل، برای چک کردن ارتباط وصل شده باید بجای متد isConnectedOrConnecting از isConnected استفاده کنید، چرا که Connecting یعنی هنوز وصل نشده ولی درحال وصل شدن هست (شاید امروز وصل شه شاید 1 ماه دیگه شایدم هیچ وقت! بخاطر مشکلات شبکه)
isConnectedOrConnecting: Indicates whether network connectivity ... being established.
... call isConnected() instead, which guarantees that the network is FULLY USABLE.
3- اگر منظور از این تابع چک کردن ارتباط اینترنتی هستش، پس باید گزینه های ETHERNET و BLUETOOTH رو حذف کنید.
و در آخر می تونید بعضی از اون شروط که return یکسانی دارند رو یکی کنید تا کد کمی بهینه تر و خلاصه تر بشه.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .