2014-10-20 108 views
0

我为kaltura媒体平台编写客户端。 我有一个活动“视频”。在这个活动中,我必须显示带有缩略图的视频列表 首先,我使用kaltura api下载视频列表,并且这工作正常。每个视频条目都有一个字段thumbnailUrl,它指向视频的缩略图。 当我下载视频缩略图时,(缩略图)以不正确的顺序下载,某些缩略图未下载,某些缩略图重复用于其他视频,有些未下载。 这是回调的代码,如果downloadind视频:如何更正下载多张图片(缩略图的视频)

private void handleFetchvideoListTask(List<VideoObject> videoObjects){ 
     LinearLayout videoListProgressBarContainer = (LinearLayout)mActivity.findViewById(R.id.videoListProgressBarContainer); 
     LinearLayout videoListViewContainer = (LinearLayout)mActivity.findViewById(R.id.videoListViewContainer); 

     videoListProgressBarContainer.setVisibility(View.GONE); 
     videoListViewContainer.setVisibility(View.VISIBLE); 

     ListView listView = (ListView)videoListViewContainer.findViewById(R.id.videoListView); 
     VideoListAdapter adapter = new VideoListAdapter((LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE)); 
     adapter.setList(videoObjects); 
     listView.setAdapter(adapter); 
     DownloadThumbnailsTask task = new DownloadThumbnailsTask(videoObjects, adapter); 
     task.execute(); 
    } 

这是DownloadThumbnailsTask代码:

public class DownloadThumbnailsTask extends AsyncTask<List<VideoObject>, VideoObject, Void>{ 

     private List<VideoObject> videoObjectList = null; 
     private List<VideoObject> toProcess = null; 
     private VideoListAdapter adapter = null; 

     public DownloadThumbnailsTask(List<VideoObject> videoObjectList, VideoListAdapter adapter){ 
      this.videoObjectList = videoObjectList; 
      this.toProcess = new ArrayList<VideoObject>(videoObjectList); 
      this.adapter = adapter; 
     } 

     @Override 
     protected Void doInBackground(List<VideoObject>... lists) { 

      for(int i=0; i<toProcess.size(); i++){ 
       VideoObject item = videoObjectList.get(i); 
       String urldisplay = item.getThumbnailUrl(); 
       Bitmap mIcon11 = null; 
       try { 
        InputStream in = new java.net.URL(urldisplay).openStream(); 
        mIcon11 = BitmapFactory.decodeStream(in); 
       } catch (Exception e) { 
        Log.e("Error", e.getMessage()); 
        e.printStackTrace(); 
       } 
       item.setThumbnail(mIcon11); 
       mIcon11 = null; 
       publishProgress(item); 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(VideoObject... values) { 
      if(values != null && values.length > 0){ 
       VideoObject item = values[0]; 
       videoObjectList.remove(item); 
       videoObjectList.add(item); 
       adapter.setList(videoObjectList); 
       adapter.notifyDataSetChanged(); 
      } 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      this.toProcess.clear(); 
      this.toProcess = null; 
     } 
    } 

这是适配器的代码:

public class VideoListAdapter extends BaseAdapter { 

    private List<VideoObject> list; 
    private LayoutInflater layoutInflater; 

    public VideoListAdapter(LayoutInflater layoutInflater){ 
     this.layoutInflater = layoutInflater; 
    } 

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

    @Override 
    public Object getItem(int i) { 
     return list.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return list.get(i).getId(); 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     if(view == null){ 
      view = layoutInflater.inflate(R.layout.list_item_video, viewGroup, false); 
     } 
     ViewHolder viewHolder = new ViewHolder(view); 
     view.setTag(viewHolder); 
     VideoObject item = getVideoObjectItem(i); 
     viewHolder.duration.setText(item.getFormattedDuration()); 
     viewHolder.title.setText(item.getName()); 
     if(item.getThumbnail() != null){ 
      viewHolder.thumbnail.setImageBitmap(item.getThumbnail()); 
     } 
     return view; 
    } 

    private VideoObject getVideoObjectItem(int position){ 
     return (VideoObject) getItem(position); 
    } 

    public List<VideoObject> getList() { 
     return list; 
    } 

    public void setList(List<VideoObject> list) { 
     this.list = list; 
    } 

    public static class ViewHolder { 
     public final ImageView thumbnail; 
     public final TextView title; 
     public final TextView duration; 

     public ViewHolder(View view) { 
      this.thumbnail = (ImageView)view.findViewById(R.id.imgVideoThumbnail); 
      this.title = (TextView)view.findViewById(R.id.txtVideoName); 
      this.duration = (TextView)view.findViewById(R.id.txtVideoDuration); 
     } 
    } 
} 

这是我的代码的结果: enter image description here enter image description here

回答

1

我注意到两两件事:

  1. doInBackground你正在等待

    InputStream in = new java.net.URL(urldisplay).openStream(); mIcon11 = BitmapFactory.decodeStream(in);

下载下一个图像之前完成。

试试这个:

protected Void doInBackground(List<VideoObject>... lists) { 
     for(final int i=0; i<toProcess.size(); i++){ 
      try { 
       new Thread(){ 
        @Override 
        public void run() { 
         VideoObject item = videoObjectList.get(i); 
         String urldisplay = item.getThumbnailUrl(); 
         Bitmap mIcon11 = null; 
         try { 
          InputStream in = new java.net.URL(urldisplay).openStream(); 
          mIcon11 = BitmapFactory.decodeStream(in); 
         } catch (Exception e) { 
          Log.e("Error", e.getMessage()); 
          e.printStackTrace(); 
         } 
         item.setThumbnail(mIcon11); 
         publishProgress(item); 
        } 
       }.start(); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(VideoObject... values) { 
     adapter.notifyDataSetChanged(); 
    } 

我觉得这两条线的问题是:

videoObjectList.remove(item); 
    videoObjectList.add(item); 

你删除的项目,并在再次探底加入。在设置位图之后调用notifyDataSetChanged。

  1. Inside getView您每次都创建一个新的ViewHolder。

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
        ViewHolder viewHolder; 
        if(view == null){ 
         view = layoutInflater.inflate(R.layout.list_item_video, viewGroup, false); 
         viewHolder = new ViewHolder(view); 
         view.setTag(viewHolder); 
        }else{ 
         viewHolder = view.getTag(); 
        } 
        VideoObject item = getVideoObjectItem(i); 
        viewHolder.duration.setText(item.getFormattedDuration()); 
        viewHolder.title.setText(item.getName()); 
        if(item.getThumbnail() != null){ 
         viewHolder.thumbnail.setImageBitmap(item.getThumbnail()); 
        } 
        return view; 
    } 
    
0

你有什么在你的logcat?也许打开流或解码失败。图像大吗?

+1

没有,我在logcat中没有错误,谢谢。 Gonji Dev的解决方案帮助我。 – Alexander 2014-10-20 16:29:18