【问题标题】:Two async calls in getview(), am I doing this right?getview() 中的两个异步调用,我这样做对吗?
【发布时间】:2013-05-09 07:39:06
【问题描述】:

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

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

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

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

  • 第 1 点,我在我的自定义 ImageAdapter 中完成了这一切。我要打电话吗 我的getView 方法中的另一个线程?

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

这是我的自定义适配器类

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

【问题讨论】:

  • 我不知道那个库,但你的代码应该知道是否已经为该行启动了检索任务。关于新线程,库很可能会处理此问题并使用后台线程,否则您的应用程序应该会非常慢。
  • 如果我可以控制getView在我滑动图库时只调用一次,我现在面临的实际问题就可以解决。由于我已将膨胀布局的宽度和高度设置为 fill_parent,因此我希望它只运行一次,但它没有发生。

标签: android android-adapter android-query


【解决方案1】:

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

没有。

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

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

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

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

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

解决方案:

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

【讨论】:

  • 好的。假设我将适配器作为一个单独的类,并在不同的线程中处理 mp3 下载,那么它如何保证 getView 只会被调用一次。
  • @pKs "getView 必须被调用两次。"这是正常的适配器行为。基本上你有一个非常混乱的应用程序架构。使适配器成为一个单独的类不会改变任何东西。它将始终绑定到 Activity 上下文,因为 AdapterViewActivity 层次结构中使用它。
  • 有没有办法确定我当前正在查看的图像 url 并基于此我会调用服务器然后流式传输音频?在正确加载音频之前,我已准备好使用进度对话框,但我可以查看图像。
  • @pKs 正如 CommonsWare 曾经说过的“熟练的开发人员会避免使用对话框”(或类似的东西)。这不是一个很好的使用对话框。正如我经常说的“这就是编程,一切皆有可能”——是的,你可以确定这一点,但是结合上次请求的图像和应该播放的 mp3 也不是一件好事。
  • 我同意你的观点,但是在这种情况下最好的解决方法是什么我准备使用两个线程但是如何避免适配器,因为它会被调用两次,因为你说过它是预期的行为,因此线程也会从适配器调用两次。
猜你喜欢
  • 2019-04-21
  • 2012-08-13
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2015-06-09
  • 2014-06-28
相关资源
最近更新 更多