2013-02-07 1 views
0

안녕하세요. 내 응용 프로그램은 XML 파일을 구문 분석하고 URL과 이미지에서 이미지를로드하고 목록보기에 표시하지만 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

이미지를 다운로드 할 때 AsyncTask를 사용하십시오. 다음을 확인하십시오 : http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html

+0

그것은 빠르게 스크롤하려고하면 ANR을 보여주기 때문에 작동 할 것입니다. – ayansinha

+0

예. 작동합니다. 스레드 (UI UI 스레드 아님)에서 다운로드 프로세스를 수행하고 UI 스레드에서 오류를 발생 시키려고했습니다. – user1744952

+0

예 마침내 내가 dathe 할 acheived 마침내 이것을 완료 엄격한 일 후에 고마워. 고마워요 :-) @ user1744952 – ayansinha

0

UI 스레드에서 네트워크 작업을 실행하고 있습니다. 작업에 AsyncTask do, Thread를 작성하십시오. 아주 쉽습니다. 코드를 옮기는 것뿐입니다.

어댑터에서이 항목을 사용하고 있기 때문에 항목 목록을 채울 예정이므로 this을 살펴보아야 할 수 있습니다. listviews getView 문제에 대한 정기적 인 문제를 피하기 원한다.

또한 이미지에 URL을로드하는 데 유용한 오픈 소스 라이브러리가 있습니다. 예를 들어 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

관련 문제