2013-02-07 22 views
0

嗨,我的应用程序是关于解析XML文件,然后加载图像从URL和文本并显示它在列表视图,但每当我从URL加载图像同时滚动列表视图一点点,它不能正确加载图像,并强制关闭应用程序。现在如何克服这种情况。请帮助这里是我的代码从网址下载图像,也是文本。从URL加载图像,但ANR显示并强制关闭应用程序

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; 

    } 

} 

回答

1
+0

将它的工作,因为当我尝试滚动快就说明ANR .. – ayansinha

+0

是的,它会奏效。它会在一个线程(非UI线程)中执行下载过程,并且您正尝试在UI线程中执行此操作,从而导致错误。 – user1744952

+0

是的,我终于完成了这个任务,谢谢你经过严格的日子。非常感谢:-) @ user1744952 – ayansinha

0

您正在UI线程上运行网络操作,请尝试创建一个AsyncTask以执行作业,以及线程。这很容易,你只需要移动代码即可。

既然你在一个适配器上使用它,这意味着你将填充一个项目列表,你可能想看看this。正如你想避免listview getView问题的常见问题。

还有一些开源库可帮助将网址加载到图像中。例如UrlImageViewHelper from Koush可以帮助你做到这一点。从您的适配器只需拨打:

 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); 

     } 
+0

谢谢@ daniel_c05它像一个魅力工作 – ayansinha