2013-02-20 33 views
0

我無法運行我非常簡單的RSS閱讀器。當試圖運行應用程序強制關閉和我的logcat讓我在這行錯誤:使用RSS提要訪問URL時出錯

InputSource myInputSource = new InputSource(rssUrl.openStream()); 

這裏是我的MainActivity.java:

package com.banagas.polypost; 

import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

String streamTitle = ""; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    TextView result = (TextView)findViewById(R.id.result); 

    try { 
     URL rssUrl = new URL("http://www.thepolypost.com/search/?q=&t=article&l=10&d=&d1=&d2=&s=start_time&sd=desc&c[]=news,news/*&f=rss"); 
     SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance(); 
     SAXParser mySAXParser = mySAXParserFactory.newSAXParser(); 
     XMLReader myXMLReader = mySAXParser.getXMLReader(); 
     RSSHandler myRSSHandler = new RSSHandler(); 
     myXMLReader.setContentHandler(myRSSHandler); 
     InputSource myInputSource = new InputSource(rssUrl.openStream()); 
     myXMLReader.parse(myInputSource); 

     result.setText(streamTitle); 

    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     result.setText("Cannot connect RSS!"); 
    } catch (ParserConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     result.setText("Cannot connect RSS!"); 
    } catch (SAXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     result.setText("Cannot connect RSS!"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     result.setText("Cannot connect RSS!"); 
    } 


} 

private class RSSHandler extends DefaultHandler 
{ 
    final int stateUnknown = 0; 
    final int stateTitle = 1; 
    int state = stateUnknown; 

    int numberOfTitle = 0; 
    String strTitle = ""; 
    String strElement = ""; 

    @Override 
    public void startDocument() throws SAXException { 
     // TODO Auto-generated method stub 
     strTitle = "--- Start Document ---\n"; 
    } 

    @Override 
    public void endDocument() throws SAXException { 
     // TODO Auto-generated method stub 
     strTitle += "--- End Document ---"; 
     streamTitle = "Number Of Title: " + String.valueOf(numberOfTitle) + "\n" 
      + strTitle; 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
          Attributes attributes) throws SAXException { 
     // TODO Auto-generated method stub 
     if (localName.equalsIgnoreCase("title")) 
     { 
      state = stateTitle; 
      strElement = "Title: "; 
      numberOfTitle++; 
     } 
     else 
     { 
      state = stateUnknown; 
     } 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) 
    throws SAXException { 
     // TODO Auto-generated method stub 
     if (localName.equalsIgnoreCase("title")) 
     { 
      strTitle += strElement + "\n"; 
     } 
     state = stateUnknown; 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) 
    throws SAXException { 
     // TODO Auto-generated method stub 
     String strCharacters = new String(ch, start, length); 
     if (state == stateTitle) 
     { 
      strElement += strCharacters; 
     } 
    } 

} 
} 

這裏是我的清單文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest   xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.banagas.polypost" 
android:versionCode="1" 
android:versionName="1.0" > 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".MainActivity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 
<uses-permission android:name="android.permission.INTERNET" /> 

<uses-sdk 
    android:minSdkVersion="4" 
    android:targetSdkVersion="11" /> 

</manifest> 

編輯: 這是我的日誌:

02-19 23:18:22.103 I/ActivityManager( 539): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.banagas.polypost/.MainActivity bnds=[540,922][540,922] u=0} from pid 1411 
02-19 23:18:22.153 I/ActivityManager( 539): Start proc com.banagas.polypost for activity com.banagas.polypost/.MainActivity: pid=10710 uid=10225 gids={3003, 1028} 
02-19 23:18:22.313 E/EmbeddedLogger( 539): App crashed! Process: com.banagas.polypost 
02-19 23:18:22.313 E/EmbeddedLogger( 539): App crashed! Package: com.banagas.polypost v1 (1.0) 
02-19 23:18:22.313 E/AndroidRuntime(10710): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.banagas.polypost/com.banagas.polypost.MainActivity}: android.os.NetworkOnMainThreadException 
02-19 23:18:22.313 E/AndroidRuntime(10710):  at com.banagas.polypost.MainActivity.onCreate(MainActivity.java:40) 
02-19 23:18:22.313 W/ActivityManager( 539): Force finishing activity com.banagas.polypost/.MainActivity 
02-19 23:18:22.864 W/ActivityManager( 539): Activity pause timeout for ActivityRecord{42908170 com.banagas.polypost/.MainActivity} 
02-19 23:18:23.475 I/ActivityManager( 539): Process com.banagas.polypost (pid 10710) has died. 
+0

你可以發佈錯誤日誌嗎? – Rajnikant 2013-02-20 07:16:47

回答

1

你得到android.os.NetworkOnMainThreadException

當應用程序試圖在其主線程執行 網絡操作時引發的異常。

這僅適用於針對Honeycomb SDK或 的應用程序。針對早期SDK版本的應用程序允許在其主要事件循環線程上執行聯網,但不鼓勵 。請參閱文檔Designing for Responsiveness。

the documentation

所以,你需要try {與網絡工程,線程主一個不同的下運動塊。閱讀painless threading可以輕鬆實現。

0

自從Android 3以來,在主線程中僅禁止http請求以防止凍結設備。 由於沒有超時請求和服務器沒有應答,一些請求變成無限循環,當用戶觸摸他的設備屏幕時,系統要求他殺了應用程序,因爲它沒有響應......爲了防止這種不好的方式做事情,系統拋出這個NetworkOnMainThreadException來提醒開發者。

我的建議是使用AsyncTask。 的的AsyncTask將執行你把它doInBackground功能在一個線程的代碼,會自動調用的線頭給這個函數是什麼doInBackground返回其onPostExecute功能。 onPostExecute與MainThread同步,並且能夠更新它。

class RSSFeedAsyncTask extends AsyncTask<URL, Void, String> 
{ 
    public interface RSSFeedAsyncTaskListener 
    { 
     public void setText(String text); 
    } 

    private RSSFeedAsyncTaskListener listener; 

    public RSSFeedAsyncTask(RSSFeedAsyncTaskListener listener) 
    { 
     this.listener = listener; 
    } 

    protected Long doInBackground(URL... urls) 
    { 
     String streamTitle = ""; 
     URL url = urls[0]; 
     try 
     { 
      // Download and parse the feed 
      ... 
      streamTitle = XX; 
     } 
     // Will catch MalformedURLException, 
     // ParserConfigurationException, 
     // SAXException and 
     // IOException 
     catch(Exception exception) 
     { 
      streamTitle = "Cannot connect RSS!"; 
     } 
    } 

    protected void onPostExecute(String result) 
    { 
     this.listener.setText(result); 
    } 
} 

然後用它在你的活動,你只需要使用您的AsyncTask這樣的:

RSSFeedAsyncTask rssFeedAsyncTask = new RSSFeedAsyncTask(this); 
rssFeedAsyncTask.execute(new URL("http://...")); 

貫徹RSSFeedAsyncTaskListener接口功能的setText更新後的用戶界面AsynTask完成了他的工作。