android.os.NetworkOnMainThreadException

मैं एंड्रॉइड में बस आरएसएस रीडर बनाते हैं। मुझे त्रुटियां हैं (मैंने कुछ समाधानों की खोज की और कोशिश की लेकिन कुछ भी नहीं):

Couldn't open http://pogoda.wp.pl/rss.xml
java.io.IOException: Couldn't open http://pogoda.wp.pl/rss.xml
at org.apache.harmony.xml.ExpatParser.openUrl(ExpatParser.java:755)
at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:292)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:390)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:266)
at com.newsreader.RssReader.getItems(RssReader.java:23)
at com.newsreader.MainActivity$1$1.run(MainActivity.java:48)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
at java.net.InetAddress.getAllByName(InetAddress.java:220)
at libcore.net.http.HttpConnection.(HttpConnection.java:71)
at libcore.net.http.HttpConnection.(HttpConnection.java:50)
at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
at org.apache.harmony.xml.ExpatParser.openUrl(ExpatParser.java:753)

और गतिविधि:

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new Thread(){
        public void run(){
            MainActivity.this.runOnUiThread(new Runnable(){

                @Override
                public void run() {
                    try{
                    RssReader reader = new RssReader("http://pogoda.wp.pl/rss.xml");
                    ListView items = (ListView) findViewById(R.id.listView1);
                    ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, reader.getItems());
                    items.setAdapter(adapter);
                    Log.i("", ""+reader);
                    items.setOnItemClickListener(new ListListener(reader.getItems(), MainActivity.this));
                    }catch(Exception e){
                        Log.e("blad", e.getMessage(), e);
                    }

                }

        });
        }
    }.start();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);

    return true;
}

 }

मुझे नहीं पता कि मैं क्या गलत कर रहा हूं। शायद किसी को भी एक ही समस्या है इसलिए कृपया मदद करें। धन्यवाद

0
रुपये रीडर रीडर = नया रुपये रीडर ("http://pogoda.wp.pl/rss.xml"); शायद थ्रेड में होना चाहिए और runOnUiThread की आवश्यकता नहीं है
जोड़ा लेखक Raghunandan, स्रोत
आपको क्या लगता है runOnUiThread() करता है?
जोड़ा लेखक laalto, स्रोत
@laalto लेकिन यह एक नए धागे के अंदर है! scnr :)
जोड़ा लेखक WarrenFaith, स्रोत
asynctask का उपयोग करने की कोशिश करें। developer.android.com/reference/android/os/AsyncTask.html
जोड़ा लेखक Andrain, स्रोत
तो, Google खोज आपके लिए काम नहीं कर रही है? stackoverflow.com/questions/6343166/…
जोड़ा लेखक 2Dee, स्रोत

3 उत्तर

के कारण: android.os.NetworkOnMainThreadException

यह खुद के लिए बोलता है।

Don't do networking on the main Thread!

AsyncTask to the rescue. Try it out it will work.

0
जोड़ा

इस समस्या को हल करने के लिए हमेशा AsyncTask का उपयोग करें।

BUT, if you're within the movie Swordfish, someone points a gun at you and say "fix it in 30 seconds", then change your targetSdkVersion to 9 in the Android Manifest and the exception will stop. Don't worry, it will run on devices with version higher than 9 too. Even so, correct your code later using AsyncTask.

0
जोड़ा
@WarrenFaith उत्तर अद्यतन किया गया।
जोड़ा लेखक Italo Borssatto, स्रोत
@ विश्वासा शर्मा मैं अब इसका उपयोग नहीं करता हूं, लेकिन एक बार बहुत उपयोगी था, जब ऐप पहले ही तैनात किया गया था और हमने तैनाती से ठीक पहले targetSdkVersion को बदल दिया था।
जोड़ा लेखक Italo Borssatto, स्रोत
@ विश्वासा शर्मा <कोड> targetSdkVersion ऐप को केवल संस्करण 9 तक सीमित नहीं करता है। यह केवल दिखाता है कि ऐप को उस संस्करण के लिए स्पष्ट रूप से परीक्षण किया गया था। लेकिन यह समाधान केवल किसी ऐसे व्यक्ति के लिए है जिसे वास्तव में जितनी जल्दी हो सके समस्या को सही करने की आवश्यकता है।
जोड़ा लेखक Italo Borssatto, स्रोत
@ विश्ववास शर्मा हां, बिल्कुल। यह निश्चित रूप से 9 से अधिक एसडीके संस्करण वाले उपकरणों पर चलाएगा।
जोड़ा लेखक Italo Borssatto, स्रोत
मैंने देखा तुमने वहॉं क्या किया है :)
जोड़ा लेखक WarrenFaith, स्रोत
AsyncTask का उपयोग करने के लिए कोड को दोबारा करने में 5 मिनट लग सकते हैं। तो जब तक कि आप स्वॉर्डफ़िश फिल्म के भीतर न हों, जहां कोई आपके पास बंदूक इंगित करता है और कहता है: "इसे 30 सेकंड में ठीक करें", कभी भी लक्ष्यस्डवर्सन को बदलने के लिए पर्याप्त आपातकाल कभी नहीं होगा ... आपको "शर्म की मेनू बटन!"
जोड़ा लेखक WarrenFaith, स्रोत
यह अपवाद को खत्म कर देगा, लेकिन क्या यह 9 से अधिक एसडीके संस्करण वाले उपकरणों पर चलता है?
जोड़ा लेखक DroidDev, स्रोत
ठीक है, इस तरह से कभी परीक्षण नहीं किया
जोड़ा लेखक DroidDev, स्रोत
क्या आपको नहीं लगता कि लक्ष्य एसडीके संस्करण 9 को बदलना ऐप को केवल 25% एंड्रॉइड उपकरणों तक सीमित कर देगा?
जोड़ा लेखक DroidDev, स्रोत

ऐसा इसलिए है क्योंकि आप गतिविधि के मुख्य धागे पर नेटवर्क ऑपरेशन कर रहे हैं। Async कार्य का उपयोग करना एक बेहतर विकल्प होगा।

0
जोड़ा
यह नहीं होना चाहिए एक टिप्पणी होनी चाहिए।
जोड़ा लेखक Adam Arold, स्रोत
यह एक टिप्पणी होनी चाहिए
जोड़ा लेखक Andrain, स्रोत
@Andrain सवाल पूछने वाले उपयोगकर्ता को एसिंक कार्य कैसे करना है, या वह कोड मांग सकता है। यदि आवश्यक हो तो मैं टिप्पणियों में कोड कैसे पोस्ट कर सकता हूं और यह मेरा जवाब है
जोड़ा लेखक DroidDev, स्रोत