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()'を呼び出そうとしています。
私は実際には 'onPreExecute'関数でも' feedItems'をどんな場合でも初期化します。その後、 'getItemCount'が動作し、エラーまたは空の場合は0を返します。 – lionscribe
ただし、Response_OK(200)の場合はProcessXml()メソッドでのみ初期化リストを作成していますが、Response_OKを取得しなかった場合、AsyncクラスのfeedItemsはnullになります。 – Rahul
これは問題を解決しませんでした。 RSSフィードはまだロードされていません。 –