1

所以,我有一个自定义的 GalleryAdapter,我在Async ImageLoading Library 的帮助下通过 ajax 调用(lib name is Aquery)从网络流式传输图像。

对于我从网络上流式传输的图像,我也有一个相应的音轨,每个图像都有,因此在同时加载图像时必须异步调用

IE

图片文件-> http://myserver.com/img1.png

音轨-> http://myserver.com/img1.mp3

  • 第 1 点,我在我的习惯中做这整件事ImageAdapter。我应该从我的getView方法中调用另一个线程吗?

  • 我在做什么-> 该getView()方法被调用了2 次我可以控制它只被调用一次,因为它不应该因为轨道根据它的调用被多次播放?

这是我的自定义适配器类

private class MainImageAdapter extends ArrayAdapter<String> {

        List<String> pagedImages;
        private Context context;
        
        public MainImageAdapter(Context context,int resid, List<String> objects ) {
            super( context, resid, objects );
            this.context=context;
            this.pagedImages=objects;
        }


           @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return pagedImages.size();
            }
            
            @Override
            public String getItem(int position) {
                // TODO Auto-generated method stub
                return pagedImages.get(position);
            }
            
            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return pagedImages.get(position).hashCode();
            }

        @SuppressWarnings("deprecation")
        public View getView(final int position, View convertView, ViewGroup parent) {
            
            View v;
            if ( convertView == null ) {
                v = LayoutInflater.from(context).inflate(R.layout.imagebook, parent, false);
            } else {
                v = convertView;
            } 
            
            System.out.println("getview called with"+position);
            
            final ImageView im=(ImageView) v.findViewById(R.id.pagedimage);
            positionMusic=position;
            
            aq.id(im).image(pagedImages.get(position), true, true, 0, 0, new BitmapAjaxCallback(){
                @Override
                public void callback(String url, ImageView iv, Bitmap bm, AjaxStatus status){
                        iv.setImageBitmap(bm);
                        
                        //This should be called only once somehow
                        mPlayer = MediaPlayer.create(MainActivity.this, Uri.parse(pagedImages.get(position).replace(".png", ".mp3")));
                        mPlayer.start();
                }
            });
            
            
            return v;
        }
    }
4

1 回答 1

2

getview() 中的两个异步调用,我这样做对吗?

不。

我在我的自定义 ImageAdapter 中完成了这一切。我应该从我的 getView 方法中调用另一个线程吗?

Aquery 正在启动另一个线程来进行下载,因此您只会复制他们已经拥有的代码。BitmapAjaxCallback.callback当该线程完成其工作时调用。

getView() 方法被调用 2 次我可以控制它只被调用一次,因为它不应该因为轨道根据它的调用被多次播放?

getView必须调用两次。第一次调用将返回View,但没有从网络下载图像。第二次调用是在图像下载并可以附加之后。仅当您已经在内存缓存中拥有图像时getView才会调用一次。你不想要的被BitmapAjaxCallback.callback调用两次。

图像下载完成后,您也在主线程上下载 mp3。它们都应该在不同的线程上下载。并且同时。

解决方案:

由于您Adapter绑定到Activity上下文并且图像和 mp3 的下载和开始播放不应绑定到该短暂的上下文,因此将其移动到Application上下文或ServiceAdapter仅请求完成的事情并从缓存中获取图像,这应该放在Application上下文中. 也许 Aquery 有一些你可以使用的缓存。

于 2013-05-09T09:00:14.967 回答