2013-12-05 3 views
-5

Я делаю просто rss-ридер в android. У меня есть ошибки (я искал и пытался какие-то решения, но ничего):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.<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; 
} 

} 

Я не знаю, что я делаю неправильно. Возможно, у кого-то есть такая же проблема, поэтому, пожалуйста, помогите. Thanks

+0

'RssReader reader = new RssReader (" http://pogoda.wp.pl/rss.xml ");' вероятно, должен быть в потоке, и нет необходимости в 'runOnUiThread' – Raghunandan

+0

попытаться использовать asynctask. http://developer.android.com/reference/android/os/AsyncTask.html – Andrain

+0

Итак, Google Search не работает для вас? http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception – 2Dee

ответ

-2

Для решения этой проблемы всегда используйте AsyncTask.

НО, если вы в фильме Swordfish, кто указывает пистолет на вас и сказать, «исправить это за 30 секунд», а затем изменить ваш targetSdkVersion к в Android Manifest и исключение остановится. Не беспокойтесь, он будет работать на устройствах с версией выше 9. Тем не менее, верните код позже, используя AsyncTask.

+0

Не думаете ли вы, что изменение целевой версии sdk на 9 ограничит приложение только около 25% устройств Android? – DroidDev

+0

@VishwasSharma 'targetSdkVersion' не ограничивает приложение только версией 9. Он показывает только, что приложение было явно протестировано на эту версию. Но это решение предназначено только для тех, кто действительно должен исправлять проблему как можно быстрее. –

+0

устранит исключение, но будет ли оно работать на устройствах с версией sdk выше 9? – DroidDev

2

Это потому, что вы выполняете сетевую операцию в основном потоке активности. Использование Задача Async будет лучшим вариантом.

+1

это должен быть комментарий – Andrain

+5

Это ** не следует ** быть комментарием. –

+0

@Andrain вопрос может быть зная, как пользователь async задачи, или он может запросить код. Теперь, как я могу отправить код в комментариях, если это необходимо, и, кстати, это мой ответ – DroidDev

1

Caused by: android.os.NetworkOnMainThreadException

Это говорит само за себя.

Не делать сети на главной теме!

AsyncTask на помощь. Попробуйте, это сработает.

Смежные вопросы