【问题标题】:Can't load an image from URL无法从 URL 加载图像
【发布时间】:2015-07-25 01:24:39
【问题描述】:

我尝试从 URL 加载图像,但它不起作用。发生了两个不同的错误。当我输入一个以 www 开头的 URL 时,应用程序不会关闭但也不会加载图像,只会显示一个空格。但是当 URL 以 http:// 开头时,应用程序将关闭。

我用来加载图像的代码是下一个:

public class ThreadAdapter extends BaseAdapter {
    ArrayList<Threadx> data;
    LayoutInflater inflater;
    public ThreadAdapter(Context context, ArrayList<Threadx> data) {
        super();
        inflater = LayoutInflater.from(context);
        this.data = data;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
    private static class ViewHolder {
        TextView tvSubject;
        TextView tvContent;
        ImageView imagen;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row_thread, null);
            viewHolder = new ViewHolder();
            viewHolder.tvSubject = (TextView) convertView
                    .findViewById(R.id.tvSubject);
            viewHolder.tvContent = (TextView) convertView
                    .findViewById(R.id.tvContent);
            viewHolder.imagen = (ImageView) convertView
                    .findViewById(R.id.image);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        String subject = data.get(position).getSubject();
        String content = data.get(position).getContent();
        String imagen = data.get(position).getImagen();
        viewHolder.tvSubject.setText(subject);
        viewHolder.tvContent.setText(content);
        Bitmap bitmap = null;
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL("www.matrallune.com/images/imagen_corporativa.jpg");
            //bitmap = BitmapFactory.decodeStream((InputStream)new URL("www.matrallune.com/images/imagen_corporativa.jpg").getContent());
            //bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            urlConnection = (HttpURLConnection) url.openConnection();
            InputStream is = urlConnection.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        viewHolder.imagen.setImageBitmap(bitmap);
        return convertView;
    }
}

正如您在代码中看到的那样,我尝试了不同的方法,但它们都有相同的问题。我的意图是从变量“imagen”中获取 URL。

【问题讨论】:

  • 你缺少 urlConnection.connect();
  • 您的应用是否拥有正确的权限?你有异常吗?
  • 你也可以使用图片加载库Picasso,它可以高效的加载图片,也可以缓存响应。 square.github.io/picasso
  • 我建议始终在 url 开头添加协议。
  • @Krupal 我试过了,但没有任何改变

标签: android listview android-listview imageview android-imageview


【解决方案1】:

使用这个问题>> Loading Bitmap to ImageView from URL in android

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    private ImageView imageView;
    private Bitmap image;

    public DownloadImageTask(ImageView imageView) {
        this.imageView = imageView;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            image = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            image = null;
        }
        return image;
    }

    @SuppressLint("NewApi")
    protected void onPostExecute(Bitmap result) {
        if (result != null) {
            imageView.setImageBitmap(result);
        }
    }
}

现在调用您的代码:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = null;
    if (convertView == null) {
        conv`enter code here`ertView = inflater.inflate(R.layout.list_row_thread, null);
        viewHolder = new ViewHolder();
        viewHolder.tvSubject = (TextView) convertView
                .findViewById(R.id.tvSubject);
        viewHolder.tvContent = (TextView) convertView
                .findViewById(R.id.tvContent);
        viewHolder.imagen = (ImageView) convertView
                .findViewById(R.id.image);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    String subject = data.get(position).getSubject();
    String content = data.get(position).getContent();
    String imagen = data.get(position).getImagen();
    viewHolder.tvSubject.setText(subject);
    viewHolder.tvContent.setText(content);
    new DownloadImageTask(viewHolder.imagen).execute("www.matrallune.com/images/imagen_corporativa.jpg");
    return convertView;
}

【讨论】:

  • 哇,它有效!是因为 AsyncTask 吗?感谢您的帮助!
  • 而且你不能在工作线程中更新 UI。所以 asynt 任务很好做。
  • 感谢您的信息;)
【解决方案2】:

我猜你错过了urlConnection.connect();
将您的代码更改为:

    try {
            URL url = new URL("www.matrallune.com/images/imagen_corporativa.jpg");
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.connect();
            InputStream is = urlConnection.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
        } catch (IOException e) {
            e.printStackTrace();
        }

虽然不确定。

正如 cmets 中所建议的,使用像 Picasso 这样的库是明智的。这很容易。只需将代码集成并更改为:

Picasso.with(context).load(url).into(imgView);

更新:尝试包括 connection.setDoInput(true); setUseCaches(false).

【讨论】:

  • @ManelMendez 好的,不过我只是在猜测......可能还有其他问题。
  • 总是一样的结果
【解决方案3】:

通过毕加索加载图像就像说123,你完成了

Picasso
.with(context) //Context 
.load("http://i.imgur.com/DvpvklR.png") //Can be Url,File..
.into(imageView)//The ImageView;

这只是正常加载,您可以在他们的Documentation找到更多选项

根据你的代码

Picasso
    .with(context) //Context 
    .load("http://matrallune.com/images/imagen_corporativa.jpg") //Can be Url,File..
    .into(viewHolder.imagen)//The ImageView;

您只是想用上面的代码替换图像加载代码。

您的最终适配器

public class ThreadAdapter extends BaseAdapter {
    ArrayList<Threadx> data;
    LayoutInflater inflater;
    private Context mContext;

    public ThreadAdapter(Context mContext, ArrayList<Threadx> data) {
        super();
        inflater = LayoutInflater.from(context);
        this.data = data;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    private static class ViewHolder {
        TextView tvSubject;
        TextView tvContent;
        ImageView imagen;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row_thread, null);
            viewHolder = new ViewHolder();
            viewHolder.tvSubject = (TextView) convertView
                    .findViewById(R.id.tvSubject);
            viewHolder.tvContent = (TextView) convertView
                    .findViewById(R.id.tvContent);
            viewHolder.imagen = (ImageView) convertView
                    .findViewById(R.id.image);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        String subject = data.get(position).getSubject();
        String content = data.get(position).getContent();
        String imagen = data.get(position).getImagen();
        viewHolder.tvSubject.setText(subject);
        viewHolder.tvContent.setText(content);

        //Loading image
        Picasso
        .with(mContext) //Context 
        .load("http://matrallune.com/images/imagen_corporativa.jpg") //Can be Url,File..
        .into(viewHolder.imagen)//The ImageView;


        return convertView;
    }
}

如果您从 Fragment 初始化适配器,您应该将上下文作为 getActivity() 传递,或者您也可以在 Fragment 的 onAttach() 中初始化它。

如果您从 Activity 初始化适配器。你只是想通过this。

正在初始化

来自活动

ThreadAdapter tAdapter = new ThreadAdapter(this,data);

来自片段

ThreadAdapter tAdapter = new ThreadAdapter(getActivity(),data);

【讨论】:

  • @ManelMendez 使用您的最终适配器更新了答案。并且包含 A-Z。询问我是否需要更多说明。
  • 当我尝试代码时应用程序停止(当我放置属性上下文时。但感谢您的帮助。
  • 告诉我 Logcat 说了什么。
  • 看:05-13 19:12:20.285 10989-10989/api.dat.dsaqp1415gm2.dsa.eetac.upc.edu.dat_android E/AndroidRuntime:致命例外:主进程:api.dat .dsaqp1415gm2.dsa.eetac.upc.edu.dat_android,PID:10989 java.lang.IllegalArgumentException:上下文不能为空。
  • 好的,好的。问题是您传递了一个空上下文。我可以看看你是如何初始化适配器对象的吗?
【解决方案4】:

使用 Picaso Lib http://square.github.io/picasso/ 调用 Picasso.with(context).load("http://imageUrl/image.png").into(imageView);

【讨论】:

  • 有点晚了@ManelMendez,但它需要是 mContext
  • 我们试试 ClassName.this
猜你喜欢
  • 2012-06-30
  • 2020-05-13
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2019-08-20
相关资源
最近更新 更多