Android 从url加载图像,但ANR显示并强制关闭应用程序
嗨,我的应用程序是关于解析xml文件,然后从url加载图像和文本,并在列表视图中显示,但每当我从url加载图像时,在向下滚动列表视图时,它无法正确加载图像,并强制关闭应用程序。现在如何克服这种情况。请帮助这里是我的代码下载图片从网址和文本Android 从url加载图像,但ANR显示并强制关闭应用程序,android,xml-parsing,image-loading,android-anr-dialog,Android,Xml Parsing,Image Loading,Android Anr Dialog,嗨,我的应用程序是关于解析xml文件,然后从url加载图像和文本,并在列表视图中显示,但每当我从url加载图像时,在向下滚动列表视图时,它无法正确加载图像,并强制关闭应用程序。现在如何克服这种情况。请帮助这里是我的代码下载图片从网址和文本 public class NewsRowAdapter extends ArrayAdapter<Item> { LoadingImage loadingImage; Bitmap bitmap = null; priva
public class NewsRowAdapter extends ArrayAdapter<Item>
{
LoadingImage loadingImage;
Bitmap bitmap = null;
private Activity activity;
private List<Item> items;
private Item objBean;
private int row;
/*private DisplayImageOptions options;
ImageLoader imageLoader;*/
public NewsRowAdapter(Activity act, int resource, List<Item> arrayList)
{
super(act, resource, arrayList);
this.activity = act;
this.row = resource;
this.items = arrayList;
/*options = new DisplayImageOptions.Builder().showStubImage(R.drawable.blank).showImageForEmptyUrl(R.drawable.blank).cacheInMemory().cacheOnDisc().build();
imageLoader = ImageLoader.getInstance();*/
}
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
View view = convertView;
ViewHolder holder;
if (view == null)
{
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(row, null);
holder = new ViewHolder();
view.setTag(holder);
} else
{
holder = (ViewHolder) view.getTag();
}
if ((items == null) || ((position + 1) > items.size()))
return view;
objBean = items.get(position);
holder.tvTitle = (TextView) view.findViewById(R.id.tvtitle);
holder.tvDesc = (TextView) view.findViewById(R.id.tvdesc);
holder.tvDate = (TextView) view.findViewById(R.id.tvdate);
holder.imgView = (ImageView) view.findViewById(R.id.image);
holder.pbar = (ProgressBar) view.findViewById(R.id.pbar);
if (holder.tvTitle != null && null != objBean.getTitle() && objBean.getTitle().trim().length() > 0)
{
holder.tvTitle.setText(Html.fromHtml(objBean.getTitle()));
}
if (holder.tvDesc != null && null != objBean.getDesc()
&& objBean.getDesc().trim().length() > 0) {
holder.tvDesc.setText(Html.fromHtml(objBean.getDesc()));
}
if (holder.tvDate != null && null != objBean.getPubdate() && objBean.getPubdate().trim().length() > 0)
{
holder.tvDate.setText(Html.fromHtml(objBean.getPubdate()));
}
if (holder.imgView != null)
{
if (null != objBean.getLink() && objBean.getLink().trim().length() > 0)
{
final ProgressBar pbar = holder.pbar;
pbar.setVisibility(View.INVISIBLE);
//---------CHANGES MADE FOR LOADING IMAGE----------//
Log.d("IMAGE NULL----------", objBean.getLink());
try
{
URL linkurl = new URL(objBean.getLink());
bitmap = BitmapFactory.decodeStream(linkurl.openConnection().getInputStream());
holder.imgView.setImageBitmap(bitmap);
} catch (MalformedURLException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
/*try
{
loadBitmap(objBean.getLink());
} catch (IOException e)
{
e.printStackTrace();
}
*/
/*imageLoader.init(ImageLoaderConfiguration.createDefault(activity));
imageLoader.displayImage(objBean.getLink(), holder.imgView, options, new ImageLoadingListener()
{
@Override
public void onLoadingComplete()
{
pbar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingFailed()
{
pbar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingStarted()
{
pbar.setVisibility(View.VISIBLE);
}
});*/
} else
{
holder.imgView.setImageResource(R.drawable.ic_launcher);
}
}
return view;
}
public class ViewHolder
{
public TextView tvTitle, tvDesc, tvDate;
private ImageView imgView;
private ProgressBar pbar;
}
}
公共类NewsRowAdapter扩展了ArrayAdapter
{
加载图像加载图像;
位图=空;
私人活动;
私人清单项目;
私有项objBean;
私人int row;
/*私有显示图像选项;
图像加载器*/
公共NewsRowAdapter(活动行为、int资源、列表arrayList)
{
超级(act、资源、arrayList);
这个活动=行动;
this.row=资源;
this.items=arrayList;
/*options=new DisplayImageOptions.Builder().showStubImage(R.drawable.blank).showImageForEmptyUrl(R.drawable.blank).cacheInMemory().cacheOnDisc().build();
imageLoader=imageLoader.getInstance()*/
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图=转换视图;
视窗座;
如果(视图==null)
{
LayoutInflater充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u服务);
视图=充气机。充气(行,空);
holder=新的ViewHolder();
视图.设置标签(支架);
}否则
{
holder=(ViewHolder)view.getTag();
}
if((items==null)| |((position+1)>items.size())
返回视图;
objBean=items.get(位置);
holder.tvTitle=(TextView)view.findViewById(R.id.tvTitle);
holder.tvDesc=(TextView)view.findViewById(R.id.tvDesc);
holder.tvDate=(TextView)view.findViewById(R.id.tvDate);
holder.imgView=(ImageView)view.findViewById(R.id.image);
holder.pbar=(ProgressBar)view.findViewById(R.id.pbar);
if(holder.tvTitle!=null&&null!=objBean.getTitle()&&objBean.getTitle().trim().length()>0)
{
holder.tvTitle.setText(Html.fromHtml(objBean.getTitle());
}
if(holder.tvDesc!=null&&null!=objBean.getDesc()
&&objBean.getDesc().trim().length()>0){
holder.tvdsc.setText(Html.fromHtml(objBean.getDesc());
}
if(holder.tvDate!=null&&null!=objBean.getPubdate()&&objBean.getPubdate().trim().length()>0)
{
holder.tvDate.setText(Html.fromHtml(objBean.getPubdate());
}
if(holder.imgView!=null)
{
if(null!=objBean.getLink()&&objBean.getLink().trim().length()>0)
{
最终进度条pbar=holder.pbar;
pbar.setVisibility(视图不可见);
//---------加载图像时所做的更改----------//
Log.d(“IMAGE NULL------”,objBean.getLink());
尝试
{
URL linkurl=新URL(objBean.getLink());
位图=BitmapFactory.decodeStream(linkurl.openConnection().getInputStream());
holder.imgView.setImageBitmap(位图);
}捕获(格式错误)
{
e、 printStackTrace();
}捕获(IOE异常)
{
e、 printStackTrace();
}
/*试一试
{
加载位图(objBean.getLink());
}捕获(IOE异常)
{
e、 printStackTrace();
}
*/
/*init(ImageLoaderConfiguration.createDefault(活动));
displayImage(objBean.getLink(),holder.imgView,options,new ImageLoadingListener())
{
@凌驾
public void onload完成()
{
pbar.setVisibility(视图不可见);
}
@凌驾
public void onload失败()
{
pbar.setVisibility(视图不可见);
}
@凌驾
public void onLoadingStarted()
{
pbar.setVisibility(View.VISIBLE);
}
});*/
}否则
{
holder.imgView.setImageResource(R.drawable.ic_启动器);
}
}
返回视图;
}
公共类视图持有者
{
公共文本视图tvTitle、tvDesc、tvDate;
私有图像视图imgView;
私人银行;
}
}
使用AsyncTask下载图像。
选中此复选框:如果您正在UI线程上运行网络操作,请尝试创建一个异步任务来完成该作业,或创建一个线程。这很容易,你所要做的就是把代码移过去 由于您在适配器上使用此选项,这意味着您将填充一个项目列表,因此您可能需要查看。因为您希望避免listviews getView问题的常规问题 还有一些开源库可以帮助将URL加载到图像中。例如,它可以帮助你做得很好。只需从适配器调用:
if (holder.imgView != null) {
if (null != objBean.getLink() && objBean.getLink().trim().length() > 0) {
final ProgressBar pbar = holder.pbar;
pbar.setVisibility(View.INVISIBLE);
//---------CHANGES MADE FOR LOADING IMAGE----------//
Log.d("IMAGE NULL----------", objBean.getLink());
String linkurl = new URL(objBean.getLink().toString());
UrlImageViewHelper.setUrlDrawable(holder.imgView, linkurl, R.id.your_default_drawable);
}
是的,它会起作用的。它将在一个线程(而不是UI线程)中完成下载过程,而您试图在UI线程中执行此操作,这将导致错误。是的,我终于做到了。谢谢您,经过几天的努力,我终于完成了此操作。非常感谢:-)@user1744952