0

私はRssReaderをfeedparserライブラリを使用して使用しようとしています。それはアンドロイドM & Nでうまくいきますが、バージョンL以下でクラッシュします。ここ iがArraylist throw Nullpointer Marshmallowの下のアンドロイドバージョンでの例外

ReadRss readRss = new ReadRss(this, recyclerView); 
     isNetworkAvailable(); 
     if (isNetworkAvailable()) { 
      readRss.execute(); 
     } else { 
      Toast.makeText(getBaseContext(), "Couldn't connect to Internet.", Toast.LENGTH_LONG).show(); 
     } 

を行っているものです

class ReadRss extends AsyncTask<Void, Void, Void> { 
Context context; 
private ProgressDialog progressDialog; 
private ArrayList<FeedItem> feedItems; 
private RecyclerView recyclerView; 

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(); 
    RssAdapter adapter = new RssAdapter(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(Document data) { 
    try { 
     URL url = new URL("http:pockettanksnews.blogspot.com/feeds/posts/default"); 
     HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection(); 
     if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
      InputStream feedStream = httpConnection.getInputStream(); 
      FeedParser parser = FeedParserFactory.newParser(); 
      System.out.println("success"); 
      Feed feed = parser.parse(feedStream); 
      feedItems=new ArrayList<>(); 
      for (Item i : feed.getItemList()) { 
       FeedItem item=new FeedItem(); 
       System.out.println(i.getTitle()); 
       item.setTitle(i.getTitle()); 
       System.out.println(i.getLink()); 
       item.setLink(i.getLink()); 
       System.out.println(i.getPubDate()); 
       item.setPubDate(i.getPubDate().toString()); 
       item.setThumbnailUrl("https:1079638729.rsc.cdn77.org/androidgame_img/pocket_tanks/real/1_pocket_tanks.jpg"); 
       item.setDescription(i.getDescription()); 
       feedItems.add(item); 
      } 

     } else { 
      System.out.println("error"); 
     } 
    } 
    catch (Exception except){ 
     ; 
    } 
} 

private Document Getdata() { 
    try { 
     String address = "http://pockettanksnews.blogspot.com/feeds/posts/default/-/pttipsyoutube/?alt=rss"; 
     URL url = new URL(address); 
     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); 
     return xmlDoc; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

を次のようにReadRssであり、私のRssAdapterはgetItemCount法上の

public class RssAdapter extends RecyclerView.Adapter<RssAdapter.MyViewHolder> { 
ArrayList<FeedItem> feedItems=new ArrayList<FeedItem>(); 
Context context; 

public RssAdapter(Context context, ArrayList<FeedItem> feedItems) { 
    this.feedItems = feedItems; 
    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) { 
    FeedItem current = feedItems.get(position); 
    holder.Title.setText(current.getTitle()); 
    holder.Description.loadDataWithBaseURL("", current.getDescription(), "text/html", "UTF-8", ""); 
    holder.Date.setText(current.getPubDate()); 

} 

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

public class MyViewHolder extends RecyclerView.ViewHolder { 
    TextView Title, Date; 
    WebView Description; 
    ImageView Thumbnail; 
    CardView cardView; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     Title = (TextView) itemView.findViewById(R.id.title_text); 
     Description = (WebView) itemView.findViewById(R.id.description_text); 
     Description.getSettings().setJavaScriptEnabled(true); 
     Date = (TextView) itemView.findViewById(R.id.date_text); 
     Thumbnail = (ImageView) itemView.findViewById(R.id.thumb_img); 
     cardView = (CardView) itemView.findViewById(R.id.cardview); 
    } 
} 

アプリがクラッシュし、以下の通りです。それはヌルポインタ例外を示しています:ヌルオブジェクトリファレンスで仮想メソッド 'int java.util.ArrayList.size()'を呼び出そうとしています。

答えて

0

エラーの場合、フィードはnullになります。だからあなたのコードを変更し、それを処理します。

// Add null check here. 
if(feedItems!= null) { 
RssAdapter adapter = new RssAdapter(context, feedItems); 
recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
recyclerView.addItemDecoration(new VerticalSpace(50)); 
recyclerView.setAdapter(adapter); 
} else { 
// Show some error 
} 

このヌルポインタを処理するもう1つの方法は、アダプタ内でnullチェックを追加することです。

public RssAdapter(Context context, ArrayList<FeedItem> feedItems) { 
if(feedItems!= null) { 
this.feedItems.addAll(feedItems); 
} 
this.context = context; 
} 

サーバーからデータを取得する際に例外が発生しているかどうかを確認してください。私は唯一Getdata()メソッドがそれに責任があると信じています。

+0

私は実際には 'onPreExecute'関数でも' feedItems'をどんな場合でも初期化します。その後、 'getItemCount'が動作し、エラーまたは空の場合は0を返します。 – lionscribe

+0

ただし、Response_OK(200)の場合はProcessXml()メソッドでのみ初期化リストを作成していますが、Response_OKを取得しなかった場合、AsyncクラスのfeedItemsはnullになります。 – Rahul

+0

これは問題を解決しませんでした。 RSSフィードはまだロードされていません。 –

関連する問題