2012-08-02 3 views
0

웹 사이트에서 RSS 피드를 읽고 안드로이드에 내 앱에 표시하려고합니다. 그러나 오류가 발생합니다. 어떤 아이디어? 나는 코드 뒤에 내 logcat을 게시 할 것이다. 도와주세요.Android 용 RSS 리더 문제

package nidhin.rss; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 

import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlpull.v1.XmlPullParserFactory; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

public class RssActivity extends Activity { 
/** Called when the activity is first created. */ 


Button ButtonStats ; 
List headlines; 

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ButtonStats = (Button) findViewById(R.id.ButtonStats); 
    ButtonStats.setOnClickListener(new clicker()); 
    headlines = new ArrayList(); 

    try { 


    URL url = new URL("http://feeds.pcworld.com/pcworld/latestnews"); 

    XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
    factory.setNamespaceAware(false); 
    XmlPullParser xpp = factory.newPullParser(); 

    xpp.setInput(getInputStream(url), "UTF_8"); 

    boolean insideItem = false; 
    int eventType = xpp.getEventType(); 

    while (eventType != XmlPullParser.END_DOCUMENT) 
    { 

    if (eventType == XmlPullParser.START_TAG) 
      { 
      if (xpp.getName().equalsIgnoreCase("item")) 
        { 

         insideItem = true; 

        } 

      else if (xpp.getName().equalsIgnoreCase("title")) 
        { 
         if (insideItem) 
         headlines.add(xpp.nextText()); //extract the headline 

        } 

       } 
      else if(eventType==XmlPullParser.END_TAG &&    xpp.getName().equalsIgnoreCase("item")) 
       { 

        insideItem=false; 

       } 

     eventType = xpp.next(); //move to next element 

    } 



    } catch (MalformedURLException e) { 

      e.printStackTrace(); 

     } catch (XmlPullParserException e) { 

      e.printStackTrace(); 

     } catch (IOException e) { 

      e.printStackTrace(); 

     } 






} 

public InputStream getInputStream(URL url) { 

     try { 

      return url.openConnection().getInputStream(); 

     } catch (IOException e) { 

      return null; 

     } 

    } 



class clicker implements Button.OnClickListener 
{ 
     public void onClick(View v) 
     {       
      if(v== ButtonStats) 
      { 


      } 
    } 

    } 
} 

로그 캣 :

08-02 21:40:02.320: E/AndroidRuntime(723): FATAL EXCEPTION: main 
08-02 21:40:02.320: E/AndroidRuntime(723): java.lang.RuntimeException: Unable to start activity ComponentInfo{nidhin.rss/nidhin.rss.RssActivity}: android.os.NetworkOnMainThreadException 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.os.Looper.loop(Looper.java:137) 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.app.ActivityThread.main(ActivityThread.java:4424) 
08-02 21:40:02.320: E/AndroidRuntime(723): at java.lang.reflect.Method.invokeNative(Native Method) 
08-02 21:40:02.320: E/AndroidRuntime(723): at java.lang.reflect.Method.invoke(Method.java:511) 
08-02 21:40:02.320: E/AndroidRuntime(723): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
08-02 21:40:02.320: E/AndroidRuntime(723): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
08-02 21:40:02.320: E/AndroidRuntime(723): at dalvik.system.NativeStart.main(Native Method) 
08-02 21:40:02.320: E/AndroidRuntime(723): Caused by: android.os.NetworkOnMainThreadException 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
08-02 21:40:02.320: E/AndroidRuntime(723): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
08-02 21:40:02.320: E/AndroidRuntime(723): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
08-02 21:40:02.320: E/AndroidRuntime(723): at java.net.InetAddress.getAllByName(InetAddress.java:220) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
08-02 21:40:02.320: E/AndroidRuntime(723): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
08-02 21:40:02.320: E/AndroidRuntime(723): at nidhin.rss.RssActivity.getInputStream(RssActivity.java:107) 
08-02 21:40:02.320: E/AndroidRuntime(723): at nidhin.rss.RssActivity.onCreate(RssActivity.java:47) 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.app.Activity.performCreate(Activity.java:4465) 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
08-02 21:40:02.320: E/AndroidRuntime(723): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
08-02 21:40:02.320: E/AndroidRuntime(723): ... 11 more 
+0

를 달성하기 위해 하나 Thread/Handler, 또는 AsyncTask를 사용할 수 있습니다. 대신 stackoverflow에 대한 답변을 spoonfed 될 것으로 기대합니다. 귀하의 로그를 분석하는 것을 배우십시오. 이것은 매우 중요한 기술입니다. – JoxTraex

+0

문제는 내 안드로이드가 4.0에서 돌아가고 있다는 것이 었습니다. 안드로이드 1.5에 같은 코드를 썼는데 제대로 작동했습니다. –

+0

@Nidhin_toms는 3.0으로 시작하여 주 스레드에서 네트워크 호출을하면 예외가 발생합니다. API 레벨을 낮은 레벨로 변경하면 기술적으로 "수정"됩니다. 올바른 방법은 스레드/처리기 또는 AsyncTask를 사용하여 네트워크 운영을 메인 스레드에서 제거하는 것입니다. 또한 더 나은 사용자 환경을 제공하고 ANR 강제 종료 가능성을 제거합니다. – FoamyGuy

답변

0
Caused by: android.os.NetworkOnMainThreadException 

이 스택 트레이스에서 그 라인은 네트워크 통화를 메인 스레드에서합니다 (RSS를 가져 오기)하려고하는 당신을 말하고있다. API 11부터 (?) 생각하면 예외가 발생합니다.

플랫폼 디자이너가 백그라운드 스레드에서 네트워크 작업을 수행해야한다고 말하려고합니다.

이 문제를 해결하려면 네트워크 통화를 메인 스레드에서 이동해야합니다. 당신은 당신은 정말 자신의 문제를 연구하려고한다이

This tutorial by Lars Vogel is a FANTASTIC overview of both