J'essaie d'utiliser RssReader en utilisant une bibliothèque feedparser. Il fonctionne bien sur Android M & N mais il se bloque sur les versions L et ci-dessous. ici est ce que je l'ai faitArraylist lançant l'exception Nullpointer dans les versions Android ci-dessous 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();
}
ReadRss est la suivante
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;
}
}
et mon RssAdapter est comme ci-dessous
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);
}
}
Les accidents d'application sur la méthode GetItemCount. Il affiche l'exception Pointeur nul: Tentative d'invocation de la méthode virtuelle 'int java.util.ArrayList.size()' sur une référence d'objet null.
Je voudrais en fait initialiser 'feedItems' dans tous les cas, même dans la fonction' onPreExecute'. Alors 'getItemCount' fonctionnera et retournera 0 si erreur ou vide. – lionscribe
Mais vous créez une liste d'initialisation uniquement dans le cas de Response_OK (200) dans la méthode ProcessXml(). Si vous n'avez pas reçu Response_OK, alors vos feedItems dans la classe Async seront null. – Rahul
cela n'a pas résolu le problème. Le flux rss ne charge toujours pas. –