无法从 URL 加载图像
Can't load an image from URL
我尝试从 URL 加载图像,但它不起作用。发生了两种不同的错误。当我放置以 www 开头的 URL 时,应用程序不会关闭但也不会加载图像,只显示白色 space。但是当 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();
将您的代码更改为:
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();
}
虽然不确定。
并且正如评论中所建议的那样,使用像 Picasso 这样的库是明智的。这很容易。只需集成并将代码更改为:
Picasso.with(context).load(url).into(imgView);
更新:尝试包括
connection.setDoInput(true);
setUseCaches(false)
.
使用 Picaso Lib http://square.github.io/picasso/ 调用 Picasso.with(context).load("http://imageUrl/image.png").into(imageView);
使用这个问题>>
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;
}
通过 Picasso 加载图片就像说 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;
}
}
如果您从片段初始化适配器,您应该将上下文作为 getActivity() 传递,或者您也可以在片段的 onAttach()
中初始化它。
如果您从 Activity 初始化适配器。你只是想通过 this
.
正在初始化
来自 Activity
ThreadAdapter tAdapter = new ThreadAdapter(this,data);
来自碎片
ThreadAdapter tAdapter = new ThreadAdapter(getActivity(),data);
我尝试从 URL 加载图像,但它不起作用。发生了两种不同的错误。当我放置以 www 开头的 URL 时,应用程序不会关闭但也不会加载图像,只显示白色 space。但是当 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();
将您的代码更改为:
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();
}
虽然不确定。
并且正如评论中所建议的那样,使用像 Picasso 这样的库是明智的。这很容易。只需集成并将代码更改为:
Picasso.with(context).load(url).into(imgView);
更新:尝试包括
connection.setDoInput(true);
setUseCaches(false)
.
使用 Picaso Lib http://square.github.io/picasso/ 调用 Picasso.with(context).load("http://imageUrl/image.png").into(imageView);
使用这个问题>>
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;
}
通过 Picasso 加载图片就像说 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;
}
}
如果您从片段初始化适配器,您应该将上下文作为 getActivity() 传递,或者您也可以在片段的 onAttach()
中初始化它。
如果您从 Activity 初始化适配器。你只是想通过 this
.
正在初始化
来自 Activity
ThreadAdapter tAdapter = new ThreadAdapter(this,data);
来自碎片
ThreadAdapter tAdapter = new ThreadAdapter(getActivity(),data);