在getview()中有两个异步调用,我这样做了吗?

时间:2013-05-09 07:39:06

标签: android android-adapter android-query

所以,我有一个自定义的GalleryAdapter,我借助异步ImageLoading库通过ajax调用(lib name is Aquery) 从网络流式传输图像。

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

即。

  

图片文件 - > 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;
        }
    }

1 个答案:

答案 0 :(得分:2)

  

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

没有

  

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

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

  

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

getView必须被调用两次。第一次通话将返回View,而不会从网络下载图像。第二次调用是在下载图像后可以附加的。只有在内存缓存中已有图像getView时才会调用一次。你不想要的是BitmapAjaxCallback.callback被叫两次。

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

解决方案提议:

当您Adapter绑定到Activity上下文并且下载图像和mp3并开始播放时不应该绑定到该短暂的上下文,请将其移至Application上下文或{{1来自Service的{​​{1}}只请求要完成的事情并从缓存中获取图像,缓存应放在Adapter上下文中。也许Aquery有一些你可以使用的缓存。