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

我正在使用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(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;
    }
 }