Android - 处理Spotify异步图像下载

时间:2016-05-10 08:07:55

标签: android asynchronous spotify

我正在开发一个Android应用程序,它可以执行多个异步连接以实现Spotify和我自己的服务器。我的问题是,当我加载曲目时,我必须等待图像在ImageView中显示。这是应用程序流程:

  1. 在应用程序运行中,我下载了一个通用播放列表,以便用第一首曲目开始玩家。
  2. (第一次异步通话)然后我下载专辑图片。
  3. (第二次异步调用)在第二步的同一时间,我连接到我的服务器并下载一组曲目(Spotify URI)。
  4. 当与服务器的异步连接时,我创建一个由Track对象组成的ArrayList。每个Track对象都有自己的属性,并调用异步任务(DownloadImageTask),该任务下载轨道的专辑图像。
  5. 在创建ArrayList之前(在下载图像时),我创建了一个带有2个TextView和一个ImageView的适配器,并将ArrayList作为ListView(MainActivity)适配器的数据。
  6. 这就是我的问题。我尝试将Track保存为ImageView的属性,以便在收到DownloadImageTask时,将接收到的Bitmap设置为ImageView的setImageBitmap函数。但就在那里,ImageView为null,因此,我无法将Image设置为对象。

    当创建列表以将指针发送到ImageView时,我正在考虑回调,但无法找到方法。否则,如果你给我一个想法,我可以尝试另一种方式。

    我可以按需发布代码(这几乎是代码,我不想用很多无用的代码提出一个很好的问题)。

    提前致谢。

    适配器代码:

    public class ContinueListAdapter  extends ArrayAdapter<MyTrack> {
    
        private int layoutResource;
    
        public ContinueListAdapter(Context context, int layoutResource, List<MyTrack> tracksList){
            super(context, layoutResource, tracksList);
            this.layoutResource = layoutResource;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            View view = convertView;
    
            if (view == null) {
                LayoutInflater layoutInflater = LayoutInflater.from(getContext());
                view = layoutInflater.inflate(layoutResource, null);
            }
    
            MyTrack theTrack = getItem(position);
    
            if (theTrack != null) {
                TextView userData = (TextView) view.findViewById(R.id.userData);
                TextView trackData = (TextView) view.findViewById(R.id.trackData);
                ImageView albumImage = (ImageView) view.findViewById(R.id.albumImage);
    
                userData.setText("Petición de: " + theTrack.getUserName());
                trackData.setText(theTrack.getSongName()+" / "+theTrack.getAlbumName());
                albumImage.setImageBitmap(theTrack.getBitmap()); //I did this first with the hope of getting the image when it was downloaded, no way.
                theTrack.setImageView(albumImage); //So I passed the ImageView to a property of the Track object, but the ImageView reference is null
            }
    
            return view;
        }
    }
    

1 个答案:

答案 0 :(得分:2)

使用Glide或Picasso库代替处理图像。您将通过3-5行代码进行后台下载,图像缓存,缩放以及这些库处理的所有内容。

  

但是ImageView为null,因此,我无法对图像进行设置

即使您下载完成后的目标图像视图已经消失,您很可能希望很快再次显示该图像(即用户将返回到您的活动或列表行将滚动回屏幕) - 因为那个缓存,下次你引用同一个图像时会从那里提供服务。