1

我在哪里解析器分配空值,但是当物场被选中(饲料变量)不为空的问题setInput设置功能。下面的代码。任何帮助表示赞赏。空指针异常:用于Xmlpullparser分配空值与StringReader

线造成的错误是:xpp.setInput(新StringReader(mwordItem.getFeed()));

package com.example.wffd; 

import android.os.Bundle; 
import android.os.AsyncTask; 
import android.app.Activity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.view.Menu; 

import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.StringReader; 

import java.net.URL; 
import java.net.HttpURLConnection; 
import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlpull.v1.XmlPullParserFactory; 




public class WffdhomeActivity extends Activity { 

    Button updateButton; 
    TextView wdTextView, cwTextView; 
    WordItem myWordItem ; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_wffdhome); 
     updateButton = (Button)findViewById(R.id.button1); 
     wdTextView = (TextView)findViewById(R.id.textView2); 
     cwTextView = (TextView)findViewById(R.id.textView3); 
     myWordItem= new WordItem(); 


     updateButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
     try { 
      URL url = new URL("http://www.dictionary.reference.com/wordoftheday/wotd.rss"); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

      new FeedGrab(myWordItem).execute(urlConnection); 
      update_screen(myWordItem); 

      cwTextView.setText(myWordItem.getWord()); 
      wdTextView.setText(myWordItem.getDefinition()); 
     } catch (XmlPullParserException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 
     }); 

    } 

    private class FeedGrab extends AsyncTask<HttpURLConnection,Void,Boolean>{ 

     WordItem aWordItem; 

     public FeedGrab(WordItem mWordItem){ 

      this.aWordItem=mWordItem; 
     } 

     protected Boolean doInBackground(HttpURLConnection... urls) { 
      try { 
       InputStream in = new BufferedInputStream(urls[0].getInputStream()); 
       aWordItem.setFeed(readStream(in)); 

      } 
      catch(IOException e) 
      { 
       e.printStackTrace(); 
      } 
      finally { 

       urls[0].disconnect(); 
      } 
      return true; 
     } 

     private String readStream(InputStream is) throws IOException { 
       StringBuilder sb = new StringBuilder(); 
       BufferedReader r = new BufferedReader(new InputStreamReader(is),1000); 
       for (String line = r.readLine(); line != null; line =r.readLine()){ 
        sb.append(line); 
       } 
       is.close(); 
       return sb.toString(); 
      } 


    } 
    public void update_screen(WordItem mwordItem)throws XmlPullParserException, IOException 
    { 
     XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     XmlPullParser xpp = factory.newPullParser(); 
     xpp.setInput(new StringReader (mwordItem.getFeed())); 


     int eventType = xpp.getEventType(); 
     String tag_id="item"; 
     boolean in_item = false,in_description = false; 

     String tag_def="description"; 



     while (eventType != XmlPullParser.END_DOCUMENT) { 

     if((eventType == XmlPullParser.START_TAG)) 
      { 
      if(tag_id.equalsIgnoreCase(xpp.getName())) 
        { 
         in_item = true; 
        }else if(tag_def.equalsIgnoreCase(xpp.getName())) 
        { 
         in_description= true; 
        } 


      } else if(eventType == XmlPullParser.END_TAG) { 
       System.out.println("End tag "+xpp.getName()); 

      } else if((eventType == XmlPullParser.TEXT) &&(in_description & in_item)) { 
       mwordItem.processString(xpp.getText()); 
       in_description=false; 
       in_item = false; 
      } 
      eventType = xpp.next(); 
     } 
     System.out.println("End document"); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.wffdhome, menu); 
     return true; 
    } 




} 

WordItemClass:

package com.example.wffd; 

public class WordItem { 
    private String word; 
    private String definition; 
    private String feed; 

    public String getFeed() { 
     return feed; 
    } 
    public void setFeed(String feed) { 
     this.feed = feed; 
    } 

    public String getWord() { 
     return word; 
    } 
    public void setWord(String word) { 
     this.word = word; 
    } 
    public String getDefinition() { 
     return definition; 
    } 
    public void setDefinition(String definition) { 
     this.definition = definition; 
    } 
    public void processString(String text){ 
     String[] phrase = text.split(":"); 
    this.setWord(phrase[0]); 
    this.setDefinition(phrase[1]); 

    } 


} 

编辑:不知道这是堆栈跟踪..但这里:

Thread [<1> main] (Suspended (exception NullPointerException)) 
    <VM does not provide monitor information> 
    WffdhomeActivity.update_screen(WordItem) line: 110 
    WffdhomeActivity$1.onClick(View) line: 51 
    Button(View).performClick() line: 4204 
    View$PerformClick.run() line: 17355 
    Handler.handleCallback(Message) line: 725 
    ViewRootImpl$ViewRootHandler(Handler).dispatchMessage(Message) line: 92 
    Looper.loop() line: 137 
    ActivityThread.main(String[]) line: 5041  
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
    Method.invoke(Object, Object...) line: 511 
    ZygoteInit$MethodAndArgsCaller.run() line: 793 
    ZygoteInit.main(String[]) line: 560 

**更新:使用调试器mwordItem.getfeed()是返回null,但Feed字符串包含数据。不知道这是怎么回事

**更新@ andy256:我认为使用aWordItem作为myWordItem的参考和修改饲料变量我已经解决了这个问题显然这不是我所做的。我如何从异步线程传递值?我尝试通过onpostexecute传递价值,但没有成功。

保护无效onPostExecute(WordItem结果){

 this.aWordItem=result; 
     return; 
    } 
+0

你可以发布堆栈跟踪吗? – andy256

回答

1

堆栈跟踪显示

WffdhomeActivity.update_screen(WordItem)线:110
WffdhomeActivity $ 1.onClick(查看)线:51

因此,第110行的内容是null

xpp.setInput(new StringReader (mwordItem.getFeed())); 

由于xpp似乎设置,请看mwordItem。它来自第51行的呼叫,其中myWordItem通过。在发布的代码中,myWordItem从未设置。

所以,从您发布的代码:myWordItemnull

+0

据我所看到的,这只是传递一个'null'参考各地。你仍然需要在某个地方创建一个'WordItem':'新的WordItem(...)'。 – andy256

+0

原来,问题是,异步线程仍在运行,而我要求的值(NULL),因为该刑法尚未完成运行。一旦我把在onPostExecute的UI update()函数,它的工作顺利 –