البرمجة

تجنب NetworkOnMainThreadException: استخدام AsyncTask في تطبيقات Android

في محاولتك للاتصال بجهازك الذي يحتوي على اتصال بالإنترنت، وجدت نفسك تواجه مشكلة خاصة بالتصريحات ورمز الخطأ android.os.NetworkOnMainThreadException. هذا الخطأ يظهر عندما يتم محاولة الوصول إلى الشبكة على خط رئيسي Main Thread في تطبيق Android، مما يؤدي إلى تجميد الواجهة الرسومية وإحداث استجابة غير سلسة للمستخدم.

لحل هذه المشكلة، يجب عليك استخدام AsyncTask أو Thread لتنفيذ الاتصال بالشبكة بصورة فرعية، بدلاً من القيام به على الخط الرئيسي. هذا سيساعد في تجنب NetworkOnMainThreadException.

في الشيفرة التي قدمتها، يمكنك تحسين الكود كما يلي:

java
public class ConnectionDetector { private Context _context; public ConnectionDetector(Context context) { this._context = context; } public boolean isConnectingToInternet() { if (networkConnectivity()) { new CheckInternetTask().execute(); // استخدام AsyncTask للاتصال بالإنترنت } else { return false; } } private boolean networkConnectivity() { ConnectivityManager cm = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } private class CheckInternetTask extends AsyncTask { @Override protected Boolean doInBackground(Void... params) { try { HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection()); urlc.setRequestProperty("User-Agent", "Test"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(3000); urlc.setReadTimeout(4000); urlc.connect(); return (urlc.getResponseCode() == 200); } catch (IOException e) { return false; } } @Override protected void onPostExecute(Boolean result) { if (result) { new TabJson().execute(); } else { dialog_popup(); } } } }

وعند استخدام هذا التحسين، يتم تنفيذ فحص الاتصال بالإنترنت في خلفية فرعية، وبالتالي لن يتسبب في إلقاء استثناء NetworkOnMainThreadException.

بهذا الشكل، يمكنك الاستمرار في تطوير تطبيقك بشكل سلس وتفادي مشكلات الأداء المحتملة.

المزيد من المعلومات

بالتأكيد، سأقدم لك المزيد من المعلومات حول مشكلتك وكيفية تحسين الكود الخاص بك.

  1. NetworkOnMainThreadException:
    هذا الاستثناء يحدث عندما يتم محاولة إجراء عمليات الشبكة على الخط الرئيسي في تطبيق Android. يُفضل دائمًا أداء العمليات ذات الصلة بالشبكة في خلفية فرعية لتجنب تجميد واجهة المستخدم.

  2. AsyncTask:
    استخدمت AsyncTask في التحسين السابق لتنفيذ عمليات الشبكة في خلفية فرعية. هذا يسمح بتنفيذ العمليات بشكل متزامن دون التأثير على تفاعل المستخدم.

  3. رمز الخطأ:
    في كود الاستثناء الذي قدمته، تشير الرسالة إلى android.os.NetworkOnMainThreadException والموقع الذي أدى إلى حدوث هذا الاستثناء.

  4. التصريحات:
    تأكد من أنك قد قمت بإضافة أذونات الشبكة والإنترنت في ملف Manifest الخاص بتطبيقك. يمكنك فعل ذلك باستخدام الرمز التالي:

    xml
    <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  5. تحسينات إضافية:
    يمكنك تحسين كودك بشكل إضافي عند استخدام HttpURLConnection. يُفضل أيضًا استخدام HttpsURLConnection للاتصال بخوادم آمنة. كما يمكنك استخدام مكتبة مثل Retrofit لتبسيط إدارة الشبكة في تطبيق Android.

  6. رسائل التعديل:
    إذا كنت تخطط للتحقق من اتصال الإنترنت بشكل متكرر، يمكنك إضافة تحكم أفضل ورسائل تحذيرية للمستخدم بمساعدة واجهة المستخدم لتعزيز تجربة المستخدم.

بتنفيذ هذه التحسينات، يمكنك تجنب مشكلة NetworkOnMainThreadException وضمان تنفيذ عمليات الشبكة بشكل آمن وفعّال في تطبيقك.

زر الذهاب إلى الأعلى