2016-10-25 12 views
0

私はxmlファイルを解析できるようにオンラインで見つかったコードを試しています。
異なる解析フィールドがlogcatに表示されます。onPostExecute()のAsyncTask doInBackground()から読み込まれたリストを呼び出す

doInBackground()のAsyncTaskで解析が行われ、その結果、特定のURLのフィールドを表示するために使用され、logcatに正しく表示されたリストの作成が行われます。

私が今したいことは、実行後のフィールドを表示できるかどうかを確認することです。
私はlogcatの表示をdoinBackground()からonPostExecute()に許可するコメントアウトされたコードブロックを移動しました。

私は私のコードをコンパイルすると、私はエラーを取得:この方法は、私はこの問題を解決することができますどのようにスーパータイプから

のメソッドをオーバーライドまたは実装していませんか?私は何か基本的なものがありますか?

public class MainActivity extends Activity { 

    public static final String LOG_TAG = "MainActivity.java"; 

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

    try { 
    // parse our XML 
    new parseXmlAsync().execute(); 
     } catch (NullPointerException e) { 
     e.printStackTrace(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
     } 

     private class parseXmlAsync extends AsyncTask<String, String, String> { 

     @Override 
     protected String doInBackground(String... strings) { 

     try { 

     // initialize our input source variable 
     InputSource inputSource = null; 

     // XML from URL 
     URL url = new URL(
     "http://feeds.news24.com/articles/fin24/Tech/rss"); 
     inputSource = new InputSource(url.openStream()); 

     // instantiate SAX parser 
     SAXParserFactory saxParserFactory = SAXParserFactory 
    .newInstance(); 
     SAXParser saxParser = saxParserFactory.newSAXParser(); 

     // get the XML reader 
     XMLReader xmlReader = saxParser.getXMLReader(); 

     // prepare and set the XML content or data handler before 
     // parsing 
     XmlContentHandler xmlContentHandler = new XmlContentHandler(); 
     xmlReader.setContentHandler(xmlContentHandler) 

     // parse the XML input source 
     xmlReader.parse(inputSource); 

     // put the parsed data to a List 
     List<ParsedDataSet> parsedDataSet = xmlContentHandler.getParsedData(); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(List<ParsedDataSet> parsedDataSet) { 

      // use an iterator so we can loop through the data 
      Iterator<ParsedDataSet> i = parsedDataSet.iterator(); 
      ParsedDataSet dataItem; 

      while (i.hasNext()) { 

       dataItem = (ParsedDataSet) i.next(); 

        /* 
        * parentTag can also represent the main type of data 
        */ 
       String parentTag = dataItem.getParentTag(); 
       Log.v(LOG_TAG, "parentTag: " + parentTag); 

       if (parentTag.equals("item")) { 
        Log.v(LOG_TAG, "Title: " + dataItem.getTitle()); 
        Log.v(LOG_TAG, "Description: " + dataItem.getDescription()); 
        Log.v(LOG_TAG, "URL: " + dataItem.getLink()); 
       } 

      } 
     } 
    } 
} 

答えて

1
parseXmlAsync extends AsyncTask<String, String, String> 

これは、あなたが<String, String, String><Params, Progress, Result>があることを意味します。

1)Progressはありません。それはVoidです。

2)Params、またはString... stringsを気にしていないようです。したがって、それもVoidになることができます。

3)onPostExecute(List<ParsedDataSet> parsedDataSet)を動作させる場合は、ResultList<ParsedDataSet>にする必要があります。

doInBackgroundから返された値はonPostExecuteになります。 nullを返しているだけなので、これが機能したとしても、parsedDataSet.iterator();はNullPointerExceptionをスローします。


は今、エラーを修正するために、あなたが

onPostExecute(String result) 

を実装するのではなく、代わりに、あなたは

ParseXmlAsync extends AsyncTask<Void, Void, List<ParsedDataSet>> 

public List<ParsedDataSet> doInBackground(Void... params) 

を使用する必要がありたいと思っていると、 、return parsedDataSetからあなたのAsyncTaskの署名がAsyncTask<String, String, String>あるとonPostExecute方法siignatureがonPostExecute(List<ParsedDataSet> parsedDataSet)代わりのonPostExecute(String response)あるので

+0

ありがとうございます。私はあなたの提案を試み、それは働いた。私はまた、私がこれを理解しようとしているように働いたK Neeraj Lalによって言及された方法1も、間違いをもう一度繰り返さない。 –

1

あなたがエラーを持っています。

あなたがこれを行うための2つのメソッド、

方法1

を持っているがparseXmlAsyncparsedDataSetはグローバルください。

private class parseXmlAsync extends AsyncTask<String, String, String> { 
    List<ParsedDataSet> parsedDataSet; 

    @Override 
    protected String doInBackground(String... strings) { 
     ... 
     parsedDataSet = xmlContentHandler.getParsedData(); 
     ... 
    } 

    @Override 
    protected void onPostExecute(String response) { 

     Iterator<ParsedDataSet> i = parsedDataSet.iterator(); 
     ... 
    } 
} 

方法2

変更はAsyncTask

private class parseXmlAsync extends AsyncTask<String, String, List<ParsedDataSet>> { 
    List<ParsedDataSet> parsedDataSet; 

    @Override 
    protected String doInBackground(String... strings) { 
     ... 
     parsedDataSet = xmlContentHandler.getParsedData(); 
     return parsedDataSet; 
     ... 
    } 

    @Override 
    protected void onPostExecute(List<ParsedDataSet> parsedDataSet) { 

     Iterator<ParsedDataSet> i = parsedDataSet.iterator(); 
     ... 
    } 
} 
+0

詳細な説明ありがとうございます。私は方法1を試して、これはうまくいった。私も方法2を試してみましたが、これはうまくいきます。御時間ありがとうございます。 –

0

問題の署名は、あなたはAysncTaskでミスを犯しています。私の下のコードを見てください。

private class parseXmlAsync extends AsyncTask<String, String, List<ParsedDataSet>> 
{ 

    @Override 
    protected List<ParsedDataSet> doInBackground(String... strings) 
    { 
     try { 

      // initialize our input source variable 
      InputSource inputSource = null; 

      // XML from URL 
      URL url = new URL("http://feeds.news24.com/articles/fin24/Tech/rss"); 
      inputSource = new InputSource(url.openStream()); 

      // instantiate SAX parser 
      SAXParserFactory saxParserFactory = SAXParserFactory 
        .newInstance(); 
      SAXParser saxParser = saxParserFactory.newSAXParser(); 

      // get the XML reader 
      XMLReader xmlReader = saxParser.getXMLReader(); 

      // prepare and set the XML content or data handler before 
      // parsing 
      XmlContentHandler xmlContentHandler = new XmlContentHandler(); 
      xmlReader.setContentHandler(xmlContentHandler); 
      xmlReader.parse(inputSource); 
      List parsedDataSet = xmlContentHandler.getParsedData(); 

      return parsedDataSet; 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

@Override 
    protected void onPostExecute(List<ParsedDataSet> parsedDataSet) { 

     // use an iterator so we can loop through the data 
     Iterator<ParsedDataSet> i = parsedDataSet.iterator(); 
     ParsedDataSet dataItem; 

     while (i.hasNext()) { 

      dataItem = (ParsedDataSet) i.next(); 

      /* 
      * parentTag can also represent the main type of data 
      */ 
      String parentTag = dataItem.getParentTag(); 
      Log.v(LOG_TAG, "parentTag: " + parentTag); 

      if (parentTag.equals("item")) { 
       Log.v(LOG_TAG, "Title: " + dataItem.getTitle()); 
       Log.v(LOG_TAG, "Description: " + dataItem.getDescription()); 
       Log.v(LOG_TAG, "URL: " + dataItem.getLink()); 
      } 

     } 


    } 
} 
関連する問題