有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何正确下载多个图像(视频缩略图)

我为kaltura媒体平台编写客户端。 我有一个活动“视频”。在此活动中,我必须显示带有缩略图的视频列表 首先,我使用kaltura api下载视频列表,效果很好。每个视频条目都有一个字段thumbnailUrl,它指向视频的缩略图。 当我为视频下载这个缩略图时,它(缩略图)的下载顺序不正确,有些缩略图没有下载,有些缩略图为其他视频重复,有些没有下载。 这是下载ind视频时的回调代码:

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

这是下载Thumbnailstask的代码:

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


共 (2) 个答案

  1. # 1 楼答案

    你的日志里有什么东西吗?可能打开流或解码失败。图像大吗

  2. # 2 楼答案

    我注意到两件事:

    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. 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;
      }