【问题标题】:loading List view images with multiple aync tasks加载具有多个异步任务的列表视图图像
【发布时间】:2014-11-11 12:57:33
【问题描述】:

我需要在列表视图中显示图像,当页面加载时,我将从网络调用的 JSON 列表中获取文件名,以形成该文件名的 url。我需要执行另一个网络调用,将文件从 s3 服务器下载到本地服务器。我正在使用 volley for imageloader 我将如何实现这就是我正在做的方式

    @Override
public View getView(int position, View convertView, ViewGroup parent) {

    Log.d(TAG, "getView called.. ");
    ViewHolder holder = null;
    AllMessage message = amList.get(position);
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.list_peer_message, parent, false);
        holder.name = (TextView) convertView.findViewById(R.id.list_am_name_top);
        holder.sub_name = (TextView) convertView.findViewById(R.id.list_am_name_bottom);
        holder.content = (TextView) convertView.findViewById(R.id.list_am_content);
        holder.time = (TextView) convertView.findViewById(R.id.list_am_time);
        holder.img_icon = (NetworkImageViewRounded) convertView.findViewById(R.id.imageView1);
        holder.img_clip = (ImageView) convertView.findViewById(R.id.list_attachment_clip);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    if (message.getType().equalsIgnoreCase("group")) {

        holder.img_icon.setDefaultImageResId(R.drawable.group_icon);

        //holder.img_icon.setDefaultImageResId(R.drawable.group_icon);
        holder.name.setText(message.getGroupName());
        holder.name.setTag("group");
        holder.sub_name.setText(message.getName() != null ? message.getName() + ":" : "");
        holder.sub_name.setTag(message.getGroupID());
        holder.img_icon.setTag(message.getGroupAvatarUrl());
        if (message.getGroupAvatarUrl().equals("")) {
            //holder.img_icon.setImageUrl(null,imageLoader);
            holder.img_icon.setDefaultImageResId(R.drawable.group_icon);
            holder.img_icon.setImageUrl(null,imageLoader);
            holder.img_icon.setTag("");

        } else {
            if (message.getGroupAvatarUrl().contains("http")) {
                // holder.img_icon.setDefaultImageResId(R.drawable.group_icon);
                holder.img_icon.setTag(message.getGroupAvatarUrl());
                holder.img_icon.setImageUrl(message.getGroupAvatarUrl(),imageLoader);
                holder.img_icon.setDefaultImageResId(R.drawable.group_icon);

            } else {
                holder.img_icon.setTag(message.getGroupAvatarUrl());
                holder.img_icon.setImageUrl(FileUtil.getServerAttachmentPath() + "/" + message.getAvatarUrl(),
                            imageLoader);
                new DownLoadAttachmentsAsyncTask().execute(holder.img_icon);

                holder.img_icon.setDefaultImageResId(R.drawable.group_icon);


            }


        }

    } else {
        holder.img_icon.setDefaultImageResId(R.drawable.ic_doctor_default);
        holder.name.setText(message.getName());
        holder.name.setTag("individual");
        holder.sub_name.setText("");
        holder.sub_name.setTag(message.docID);
        holder.img_icon.setTag(message.getAvatarUrl());

        if (message.getAvatarUrl().equals("")) {
            Log.d(TAG, "Empty Doc avathar for " + message.getName());
            holder.img_icon.setDefaultImageResId(R.drawable.ic_doctor_default);
            holder.img_icon.setImageUrl(null,imageLoader);
            //holder.img_icon.setImageUrl(null,imageLoader);

            //holder.img_icon.setImageResource(R.drawable.ic_doctor_default);
            //holder.img_icon.setImageResource(R.drawable.ic_doctor_default);
        } else {

            holder.img_icon.setImageUrl(FileUtil.getServerAttachmentPath() + "/" + message.getAvatarUrl(),
                        imageLoader);
            new DownLoadAttachmentsAsyncTask().execute(holder.img_icon);

            holder.img_icon.setDefaultImageResId(R.drawable.ic_doctor_default);
            //holder.img_icon.setErrorImageResId(R.drawable.ic_doctor_default);
            //holder.img_icon.setImageUrl(FileUtil.getServerAttachmentPath() + "/" + message.getAvatarUrl(),imageLoader);

        }

    }



    return convertView;
}

private static class ViewHolder {
    TextView name, sub_name, content, time;
    NetworkImageViewRounded img_icon;
    ImageView img_clip;
}


 // DownLoad Async task for avathars 
public class DownLoadAttachmentsAsyncTask extends AsyncTask<NetworkImageViewRounded, Void, NetworkImageViewRounded> {
    //private final WeakReference<NetworkImageViewRounded> imageViewReference;
    //private final WeakReference<Integer> position;

    public DownLoadAttachmentsAsyncTask() {
        //imageViewReference = new WeakReference<NetworkImageViewRounded>(imageViewReference);
    }

    @Override
    protected void onCancelled() {
    }

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected NetworkImageViewRounded doInBackground(NetworkImageViewRounded... params) {
        NetworkImageViewRounded  imageView = null;
        if (NetworkUtil.isNetworkAvailable(mContext)) {
            imageView = params[0];
            // Log.d("doInBackground",fileName);
            if (APIEngine.downLoadAttachment(imageView.getTag().toString(), "avatar")) {
                Log.d(TAG, "Downlaod done for name filename is "+imageView.getTag().toString());
                return imageView;

            } else {
                Log.d(TAG, "Downlaod failed for   --- "+imageView.getTag().toString());
            }

        } else {
            Log.d(TAG, "No network ");
        }
        return imageView;
    }

    @Override
    protected void onPostExecute(NetworkImageViewRounded imageView) {
        if (imageView != null) {

            if (imageView.getTag().toString() != null) {
                String fileUrl = imageView.getTag().toString();
                /*String fileNameJust;
                if(fileUrl.contains("http")){
                    fileNameJust = FileUtil.getFileNameFromS3URL(fileUrl);
                }else{
                    fileNameJust = fileUrl;
                }*/
                Log.d(TAG, FileUtil.getServerAttachmentPath() + "/" + fileUrl);
                imageView.setImageUrl(FileUtil.getServerAttachmentPath() + "/" + fileUrl,
                            imageLoader);

            }else{
                Log.d(TAG, "Nul file URL");
            }
            //notifyDataSetChanged();

        }

    }

}

【问题讨论】:

  • 那么问题出在哪里?到目前为止你有没有尝试过?
  • 只是...您已经在这里写下您的要求...?试试吧。?这不是问题吗?
  • 我不想每次在 getView() onscrolling 滚动时都调用下载 API,下载文件网络调用应该每次 getView 调用一次
  • 使用 ViewHolder 模式...

标签: android android-listview android-asynctask lazy-loading android-volley


【解决方案1】:

【讨论】:

  • 我需要调用另一个网络调用来为每个列表行图像视图形成 URL
【解决方案2】:

无需使用 ImageLoader/Universal Imageloader Library。结帐This 名为 Picasso 的很棒的图书馆。下载jar文件here。在项目的构建路径中包含 jar,它会通过简单的方法使用 Url 将图像加载到您的 imageview 中

    Picasso.with(context).load("imageurl.png").into(yourImageView);

只需在适配器的 getview 方法中使用这一行。

【讨论】:

  • 我也可以使用 volley 来实现,我对每个列表行都有额外的网络调用来形成图像的 url,这就是问题所在
  • 这就是我告诉你使用这个库的原因。它将自动处理所有调用并缓存。然后您不必担心每次调用 getView() 方法时都会调用网络
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多