Android 如何从网络上获取图像
我正在使用RSS提要进行新闻android项目,我的应用程序现在可以完美地获取新闻的标题、描述和时间,但我无法获取图像,它显示了以下错误:Android 如何从网络上获取图像,android,android-studio,rss-reader,Android,Android Studio,Rss Reader,我正在使用RSS提要进行新闻android项目,我的应用程序现在可以完美地获取新闻的标题、描述和时间,但我无法获取图像,它显示了以下错误: java.lang.NullPointerException: uriString at android.net.Uri$StringUri.<init>(Uri.java:464) at android.net.Uri$StringUri.<init>(Uri.java:454) at android.net.Uri.parse(U
java.lang.NullPointerException: uriString
at android.net.Uri$StringUri.<init>(Uri.java:464)
at android.net.Uri$StringUri.<init>(Uri.java:454)
at android.net.Uri.parse(Uri.java:426)
at com.example.drmzr.myapplication.MyAdapter.onBindViewHolder(MyAdapter.java:36)
at com.example.drmzr.myapplication.MyAdapter.onBindViewHolder(MyAdapter.java:12)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5453) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5486) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4723)
这是(my Adapter.java):
公共类MyAdapter扩展了RecyclerView.Adapter{
上下文c;
ArrayList文章;
公共MyAdapter(上下文c、ArrayList文章){
这个.c=c;
这个.文章=文章;
}
@凌驾
public MyHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutFlater.from(c).充气(R.layout.model,父视图,false);
归还新的MyHolder(v);
}
@凌驾
公共无效onBindViewHolder(MyHolder,int位置){
Article=articles.get(位置);
holder.titleTxt.setText(article.getTitle());
holder.descTxt.setText(article.getDescription());
holder.dateTxt.setText(article.getDate());
setImageURI(Uri.parse(article.getImage());
}
@凌驾
public int getItemCount(){
返回物品。大小();
}
}
这是包含上述错误的行(holder.gimage.setImageURI(Uri.parse(article.getImage());)
这是(我的RSSParser.java):
公共类RSSParser扩展异步任务{
上下文c;
输入流为;
回收视图rv;
进展性帕金森病;
ArrayList articles=新的ArrayList();
公共RSSParser(上下文c、输入流is、RecyclerView rv){
这个.c=c;
this.is=is;
这个.rv=rv;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pd=新进度对话框(c);
pd.setTitle(“解析数据”);
设置消息(“正在分析数据…请稍候”);
pd.show();
}
@凌驾
受保护的布尔doInBackground(Void…params){
返回这个.parseRSS();
}
@凌驾
受保护的void onPostExecute(布尔值isParsed){
super.onPostExecute(isParsed);
pd.解散();
如果(isParsed)
{
//束缚
rv.setAdapter(新的MyAdapter(c,文章));
}否则{
Toast.makeText(c,“无法解析”,Toast.LENGTH_SHORT.show();
}
}
私有布尔parsers()
{
尝试
{
XmlPullParserFactory工厂=XmlPullParserFactory.newInstance();
XmlPullParser=factory.newPullParser();
setInput(is,null);
int event=parser.getEventType();
字符串值=null;
条款。清晰();
第条=新条款();
做{
String name=parser.getName();
开关(事件)
{
case XmlPullParser.START_标记:
如果(名称等于(“项目”))
{
第条=新条款();
}
打破
case XmlPullParser.TEXT:
value=parser.getText();
打破
case XmlPullParser.END_标记:
如果(名称等于(“头衔”))
{
第条.产权(价值);
}
else if(name.equals(“description”))
{
第条.说明(价值);
}else if(name.equals(“pubDate”))
{
第条设定日期(价值);
}如果(名称等于(“日期”))
{
第条设定日期(价值);
}else if(name.equals(“image”))
{
第2条.setImage(价值);
}
如果(名称等于(“项目”))
{
增加(第条);
}
打破
}
event=parser.next();
}while(event!=XmlPullParser.END_文档);
返回true;
}catch(XMLPullParseRexE){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回false;
}
}
公共字符串getImage(){
if(description.startsWith(“异常清楚地表明,article.getImage()
检查article.setImage(value);
value
在重试解析之前,holder可能与我使用你的代码时应该的内容重复!像这样还是什么?bindViewHolder上的公共无效(MyHolder holder,int位置){Article-Article=articles.get(position);holder.gimage.setImageURI(Uri.parse(Article.getImage());;}
public class Article {
String title,description,date,link,image;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}
public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
Context c;
ArrayList<Article> articles;
public MyAdapter(Context c, ArrayList<Article> articles) {
this.c = c;
this.articles = articles;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v= LayoutInflater.from(c).inflate(R.layout.model,parent,false);
return new MyHolder(v);
}
@Override
public void onBindViewHolder(MyHolder holder, int position) {
Article article=articles.get(position);
holder.titleTxt.setText(article.getTitle());
holder.descTxt.setText(article.getDescription());
holder.dateTxt.setText(article.getDate());
holder.gimage.setImageURI(Uri.parse(article.getImage())) ;
}
@Override
public int getItemCount() {
return articles.size();
}
}
public class RSSParser extends AsyncTask<Void,Void,Boolean> {
Context c;
InputStream is;
RecyclerView rv;
ProgressDialog pd;
ArrayList<Article> articles=new ArrayList<>();
public RSSParser(Context c, InputStream is, RecyclerView rv) {
this.c = c;
this.is = is;
this.rv = rv;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pd=new ProgressDialog(c);
pd.setTitle("Parse data");
pd.setMessage("Parsing data...Please wait");
pd.show();
}
@Override
protected Boolean doInBackground(Void... params) {
return this.parseRSS();
}
@Override
protected void onPostExecute(Boolean isParsed) {
super.onPostExecute(isParsed);
pd.dismiss();
if(isParsed)
{
//Bind
rv.setAdapter(new MyAdapter(c,articles));
}else {
Toast.makeText(c,"Unable To Parse", Toast.LENGTH_SHORT).show();
}
}
private Boolean parseRSS()
{
try
{
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser parser=factory.newPullParser();
parser.setInput(is, null);
int event=parser.getEventType();
String value=null;
articles.clear();
Article article=new Article();
do {
String name=parser.getName();
switch (event)
{
case XmlPullParser.START_TAG:
if(name.equals("item"))
{
article=new Article();
}
break;
case XmlPullParser.TEXT:
value=parser.getText();
break;
case XmlPullParser.END_TAG:
if(name.equals("title"))
{
article.setTitle(value);
}
else if(name.equals("description"))
{
article.setDescription(value);
}else if(name.equals("pubDate"))
{
article.setDate(value);
}else if(name.equals("date"))
{
article.setDate(value);
}else if(name.equals("image"))
{
article.setImage(value) ;
}
if(name.equals("item"))
{
articles.add(article);
}
break;
}
event=parser.next();
}while (event != XmlPullParser.END_DOCUMENT);
return true;
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
public String getImage() {
if (description.startsWith("<a ")) {
String cleanUrl = description.substring(description.indexOf("src=") + 5, description.indexOf("/>") - 2);
return cleanUrl;
} else {
return image;
}
}