Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

android.os.NetworkOnMainThreadException कैसे ठीक करें?

NetworkOnMainThreadException को ठीक करना

NetworkOnMainThreadException तब फेंका जाता है जब ऐप मुख्य (UI) थ्रेड पर नेटवर्क ऑपरेशन करने का प्रयास करता है। यह एंड्रॉइड 3.0 (हनीकॉम्ब) और उच्चतर पर लागू होता है।

❌ समस्या: मुख्य थ्रेड पर नेटवर्क कॉल

// गलत - यह क्रैश करेगा
URL url = new URL("https://example.com/data.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
String data = reader.readLine(); // मुख्य थ्रेड पर नेटवर्क I/O!

✅ समाधान 1: AsyncTask (डिप्रिकेटेड लेकिन सरल)

नोट: AsyncTask API 30 में डिप्रिकेटेड है। नए प्रोजेक्ट्स के लिए नीचे दिए गए आधुनिक विकल्प देखें।

चरण 1: लेआउट XML

res/layout/activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textLoad"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="लोड हो रहा है..."
        android:textSize="12sp"
        android:textStyle="bold|italic" />

    <TextView
        android:id="@+id/textMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:textStyle="bold" />
</LinearLayout>

चरण 2: AsyncTask इम्प्लीमेंटेशन

MainActivity.java:

import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    private TextView textLoad, textMessage;
    private static final String URL_STRING = "https://example.com/data.txt";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textLoad = findViewById(R.id.textLoad);
        textMessage = findViewById(R.id.textMessage);
        textLoad.setText("लोड हो रहा है...");

        new FetchDataTask().execute();
    }

    private class FetchDataTask extends AsyncTask {
        @Override
        protected String doInBackground(Void... voids) {
            try {
                URL url = new URL(URL_STRING);
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(url.openStream()));
                StringBuilder result = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
                reader.close();
                return result.toString();
            } catch (IOException e) {
                e.printStackTrace();
                return "त्रुटि: " + e.getMessage();
            }
        }

        @Override
        protected void onPostExecute(String result) {
            textMessage.setText(result);
            textLoad.setText("पूर्ण");
        }
    }
}

✅ समाधान 2: Thread + Handler (बेसिक)

new Thread(() -> {
    try {
        URL url = new URL(URL_STRING);
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(url.openStream()));
        StringBuilder result = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            result.append(line);
        }
        reader.close();

        // UI अपडेट के लिए मुख्य थ्रेड पर वापस आएं
        runOnUiThread(() -> {
            textMessage.setText(result.toString());
            textLoad.setText("पूर्ण");
        });
    } catch (IOException e) {
        e.printStackTrace();
        runOnUiThread(() -> textMessage.setText("त्रुटि: " + e.getMessage()));
    }
}).start();

✅ समाधान 3: ExecutorService (अनुशंसित - जावा)

import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

private final ExecutorService executor = Executors.newSingleThreadExecutor();

private void fetchData() {
    textLoad.setText("लोड हो रहा है...");
    executor.execute(() -> {
        try {
            URL url = new URL(URL_STRING);
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(url.openStream()));
            StringBuilder result = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }
            reader.close();

            runOnUiThread(() -> {
                textMessage.setText(result.toString());
                textLoad.setText("पूर्ण");
            });
        } catch (IOException e) {
            e.printStackTrace();
            runOnUiThread(() -> textMessage.setText("त्रुटि: " + e.getMessage()));
        }
    });
}

@Override
protected void onDestroy() {
    super.onDestroy();
    executor.shutdown(); // संसाधन मुक्त करें
}

✅ समाधान 4: Kotlin Coroutines (आधुनिक मानक)

// build.gradle में:
// implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.0"

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.coroutines.lifecycle.lifecycleScope

lifecycleScope.launch {
    textLoad.text = "लोड हो रहा है..."
    try {
        val result = withContext(Dispatchers.IO) {
            URL(URL_STRING).readText()
        }
        textMessage.text = result
        textLoad.text = "पूर्ण"
    } catch (e: Exception) {
        textMessage.text = "त्रुटि: ${e.message}"
    }
}

✅ समाधान 5: Retrofit/Volley/OkHttp (नेटवर्किंग लाइब्रेरी)

उत्पादन ऐप्स के लिए मजबूत नेटवर्किंग लाइब्रेरी का उपयोग करें:

// Retrofit उदाहरण
interface ApiService {
    @GET("data.txt")
    suspend fun getData(): Response
}

// उपयोग:
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://example.com/")
    .build();

ApiService service = retrofit.create(ApiService.class);
service.getData().enqueue(new Callback() {
    @Override
    public void onResponse(Call call, Response response) {
        textMessage.setText(response.body());
        textLoad.setText("पूर्ण");
    }
    @Override
    public void onFailure(Call call, Throwable t) {
        textMessage.setText("त्रुटि: " + t.getMessage());
    }
});

चरण 3: Manifest में इंटरनेट अनुमति

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <uses-permission android:name="android.permission.INTERNET" />

    <application ...>
        <activity android:name=".MainActivity" android:exported="true">...</activity>
    </application>
</manifest>

📋 सारांश: कौन सा उपयोग करें?

दृष्टिकोणउपयोग केस
Retrofit/OkHttpउत्पादन ऐप्स, REST APIs, जटिल नेटवर्किंग
Kotlin Coroutinesआधुनिक कोटलिन ऐप्स, सरल एसिंक कार्य
ExecutorServiceजावा ऐप्स, बैकग्राउंड थ्रेड पूल
WorkManagerडिफरेबल, गारंटीड बैकग्राउंड कार्य
AsyncTaskकेवल लिगेसी कोड रखरखाव

ऐप चलाएं

डिवाइस कनेक्ट करें, Run पर क्लिक करें। डेटा लोड होने पर "पूर्ण" और कंटेंट दिखाई देगा।

  1. एंड्रॉइड ब्लैक स्क्रीन ऑफ डेथ ठीक करें: स्टेप-बाय-स्टेप ट्रबलशूटिंग गाइड एंड्रॉइड ब्लैक स्क्रीन ऑफ डेथ ठीक करें: स्टेप-बाय-स्टेप ट्रबलशूटिंग गाइड

    इस तथ्य के बावजूद कि एंड्रॉइड पर यूजर्स की संख्या किसी भी अन्य प्लेटफॉर्म से अधिक है, यह अभी भी समस्या-मुक्त नहीं है। हालांकि एंड्रॉइड डेवलपमेंट इसे बेहतर बनाने के लिए कड़ी मेहनत कर रहा है, फिर भी कई समस्याओं को स्वीकार किया जाना बाकी है। कंप्यूटर में BSOD की तरह ब्लैक स्क्रीन ऑफ डेथ एक ऐसी समस्या ह

  1. एंड्रॉइड स्क्रीन फ़्लिकरिंग ठीक करें: क्विक फिक्स और ट्रबलशूटिंग स्टेप्स एंड्रॉइड स्क्रीन फ़्लिकरिंग ठीक करें: क्विक फिक्स और ट्रबलशूटिंग स्टेप्स

    स्क्रीन फ़्लिकरिंग समस्या आजकल काफी आम है। जब आपके स्मार्टफोन की स्क्रीन फ़्लिकर या ब्लिंक करने लगती है, तो इसके पीछे मुख्य कारण हाल ही में हुई गिरावट हो सकती है। चूंकि स्क्रीन सबसे कमजोर घटक है, इसलिए भौतिक क्षति समय के साथ अपना असर दिखाने लगती है। हालांकि, अगर आपको लगता है कि समस्या बिना किसी कारण

  1. एंड्रॉइड मोबाइल डेटा समस्याओं को तुरंत ठीक करें एंड्रॉइड मोबाइल डेटा समस्याओं को तुरंत ठीक करें

    जब आपको अपना पहला स्मार्टफोन मिलता है, तो सेल्युलर डेटा या मोबाइल डेटा उन चीजों में से एक बन जाता है जो जीवन की आवश्यकता बन जाती है। यह केवल तब पता चलता है जब आप कनेक्टिविटी खो देते हैं कि आपको पता नहीं है कि Google Maps के बिना आप कहां जा रहे हैं, Flipboard के बिना क्या पढ़ना है, और WhatsApp के बिन