2017-04-23 83 views
-1

我有一個RSS feed,這時候我已經改變了原料來源是一個錯誤崩潰:RSS飼料 - 空對象引用

Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference.

我已經通過我的新的鏈接,並看着我它應該仍然工作的邏輯(所有節點幾乎都是相同的),但由於某種原因它不。

理想情況下,我想同時使用這兩個鏈接。這是我的代碼可能的,因爲我以前一起使用過兩個鏈接。

任何想法爲什麼這不起作用?

新的鏈接(即我試圖使用):https://feeds.finance.yahoo.com/rss/2.0/headline?s=yhoo,msft,tivo&region=US&lang=en-US

舊鏈接:https://www.bloomberg.com/politics/feeds/site.xml

RSSFeed.java:

public class ReadRss extends AsyncTask<Void,Void,Void>{ 
ArrayList<FeedItem>feedItems; 
RecyclerView recyclerView; 
Context context; 
static ArrayList<String>address; 

static { 
    address=new ArrayList<>(); 
    address.add("http://finance.yahoo.com/rss/headline?s=yhoo,msft,tivo"); 
    //address.add("https://www.bloomberg.com/politics/feeds/site.xml"); 
    //address.add("https://www.bloomberg.com/feeds/podcasts/etf_report.xml"); 
} 

ProgressDialog progressDialog; 
URL url; 
public ReadRss(Context context, RecyclerView recyclerView){ 
    this.recyclerView=recyclerView; 
    this.context=context; 
    progressDialog=new ProgressDialog(context); 
    progressDialog.setMessage("Loading..."); 
} 

@Override 
protected void onPreExecute() { 
    progressDialog.show(); 
    super.onPreExecute(); 
} 

@Override 
protected void onPostExecute(Void aVoid) { 

    super.onPostExecute(aVoid); 
    progressDialog.dismiss(); 
    MyAdapter adapter=new MyAdapter(context,feedItems); 
    recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
    recyclerView.addItemDecoration(new VerticalSpace(50)); 
    recyclerView.setAdapter(adapter); 
} 

@Override 
protected Void doInBackground(Void... params) { 
    ProcessXml(Getdata()); 
    return null; 
} 

private void ProcessXml(ArrayList<Document> data) { 
    if (data != null) { 
     feedItems = new ArrayList<>(); 
     for (Document doc : data) { 
      Element root = doc.getDocumentElement(); 
      Node channel = root.getChildNodes().item(0); 
      NodeList items = channel.getChildNodes(); 
      for (int i = 0; i < items.getLength(); i++) { 
       Node currentchild = items.item(i); 
       if (currentchild.getNodeName().equalsIgnoreCase("item")) { 
        FeedItem item = new FeedItem(); 
        NodeList itemchilds = currentchild.getChildNodes(); 
        for (int j = 0; j < itemchilds.getLength(); j++) { 
         Node current = itemchilds.item(j); 
         if (current.getNodeName().equalsIgnoreCase("title")) { 
          item.setTitle(current.getTextContent()); 
         } else if (current.getNodeName().equalsIgnoreCase("description")) { 
          item.setDescription(current.getTextContent()); 
         } else if (current.getNodeName().equalsIgnoreCase("pubDate")) { 
          item.setPubDate(current.getTextContent()); 
         } else if (current.getNodeName().equalsIgnoreCase("link")) { 
          item.setLink(current.getTextContent()); 
         } 

        } 
        feedItems.add(item); 
        Log.d("itemTitle", item.getTitle()); 
        Log.d("itemDescription", item.getTitle()); 
        Log.d("itemLink", item.getTitle()); 
        Log.d("itemPubDate", item.getTitle()); 
       } 
      } 
     } 
    } 
} 

public ArrayList<Document> Getdata(){ 
    ArrayList<Document> documents = new ArrayList<>(); 
    for (String addr: address) { 
     try { 
      url = new URL(addr); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("GET"); 
      InputStream inputStream = connection.getInputStream(); 
      DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
      Document xmlDoc = builder.parse(inputStream); 
      documents.add(xmlDoc); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
    return documents; 
} 

}

MyAdapter。 java:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ 
    ArrayList<FeedItem>feedItems; 
    Context context; 
    public MyAdapter(Context context,ArrayList<FeedItem>afeedItems){ 
     this.feedItems= new ArrayList<FeedItem>(afeedItems); 
     this.context=context; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view= LayoutInflater.from(context).inflate(R.layout.custum_row_news_item,parent,false); 
     MyViewHolder holder=new MyViewHolder(view); 
     return holder; 

    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     YoYo.with(Techniques.FadeIn).playOn(holder.cardView); 
     final FeedItem current=feedItems.get(position); 
     holder.Title.setText(current.getTitle()); 
     holder.Description.setText(current.getDescription()); 
     holder.Date.setText(current.getPubDate()); 
     holder.cardView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(context, NewsDetails.class); 
       intent.putExtra("Link", current.getLink()); 
       context.startActivity(intent); 
      } 
     }); 

    } 

    @Override 
    public int getItemCount() { 
     return feedItems.size(); 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     TextView Title,Description,Date; 
     CardView cardView; 
     public MyViewHolder(View itemView) { 
      super(itemView); 
      Title= (TextView) itemView.findViewById(R.id.title_text); 
      Description=(TextView) itemView.findViewById(R.id.description_text); 
      Date=(TextView) itemView.findViewById(R.id.date_text); 
      cardView= (CardView) itemView.findViewById(R.id.cardview); 
     } 
    } 
} 
+0

@JoeC我做了我的研究之前,問題的解決方案沒有解決我的公關oblem。乾杯。 – Joe

+0

擺脫NPE的解決方案是**始終**在實例化之前查找您正在使用的對象。 –

+0

我試着做那個答案的建議,沒有運氣@Rotwang。這就是我問這個問題的原因。 – Joe

回答

2

當你分配一個ArrayList到另外一臺這樣的:

this.feedItems=feedItems; 

它們都有相同的refrence到一個ArrayList,而不是直接分配,你應該在列表中的值複製從feedItemsthis.feedItems,例如:

ArrayList<FeedItem> newFeedItems = new ArrayList<FeedItem>(oldFeedItems); 

asynctask執行完畢後,的AsyncTask類的對象feedItems將被釋放,然後你的適配器類feedItems也將被重新ferenced爲空值

該錯誤說,feedItems.size()方法從一個空引用對象調用

編輯:

構造適配器必須是這樣的:

public MyAdapter(Context context,ArrayList<FeedItem>afeedItems){ 
    this.feedItems= new ArrayList<FeedItem>(afeedItems); 
    this.context=context; 
} 

至於另一建議不要使用完全相同的名稱爲多個變量

+0

感謝您的答案和信息!我不知道。所以,我應該複製值(ArrayList newFeedItems = new ArrayList (feedItems);)MyAdapter裏面?或在RSS?再次感謝。 – Joe

+0

@Joe你的適配器類的構造器應該改變,我編輯我的答案並添加新的構造器代碼 –

+0

謝謝!現在發生的是它沒有顯示任何東西。就像它沒有從XML獲取任何數據。謝謝Mahmood! – Joe

0

我最好的猜測是你的Getdata()函數出了問題。

這將返回null,並且將通過創建您所描述的空對象引用的幾個函數靜靜地傳遞null。

+0

歡呼的答案!我已經看到了我所知的最好的東西,但無法找到任何東西,我會繼續尋找。謝謝 – Joe