android.os.NetworkOnMainThreadException

时间:2013-12-05 13:11:59

标签: java android xml xml-parsing

我在android中简单地编写rss阅读器。我有错误(我搜索并尝试了一些解决方案,但没有):

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.<init>(HttpConnection.java:71)
at libcore.net.http.HttpConnection.<init>(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<RssItem> adapter = new ArrayAdapter<RssItem>(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;
}

 }

我不知道我做错了什么。也许有人遇到了同样的问题所以请帮助。 感谢

3 个答案:

答案 0 :(得分:2)

这是因为您正在活动的主线程上执行网络操作。使用异步任务将是更好的选择。

答案 1 :(得分:1)

Caused by: android.os.NetworkOnMainThreadException

这说明了一切。

不要在主线程上进行网络连接!

AsyncTask救援。尝试一下它会起作用。

答案 2 :(得分:-2)

始终使用AsyncTask来解决此问题。

但是,如果你在电影Swordfish内,有人用枪指着你并说“在30秒内修好”,然后将你的targetSdkVersion更改为Android Manifest中的 9 ,异常将停止。别担心,它也会在版本高于9的设备上运行。即便如此,请稍后使用AsyncTask更正您的代码。