1

そのため、 Ajax 呼び出しを介して Async ImageLoading Library を(lib name is Aquery)使用して Web から画像をストリーミングするカスタム GalleryAdapter があります。

私がウェブからストリーミングした画像には、対応するオーディオトラックもあり、すべての画像に対応しているため、画像が同時に読み込まれるときに非同期で呼び出す必要があります。

すなわち

画像ファイル -> http://myserver.com/img1.png

サウンドトラック -> http://myserver.com/img1.mp3

  • ポイント番号 1、私は自分のカスタム内でこのすべてを行いますImageAdaptergetViewメソッド内から別のスレッドを呼び出しますか?

  • 私がやっていること ->getView()メソッドが2 回呼び出されます。呼び出しに基づいてトラックが複数回再生されるため、1 回だけ呼び出されるように制御できますか?

これは私のカスタムアダプタークラスです

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() での 2 つの非同期呼び出し、これは正しいですか?

いいえ。

このすべてをカスタム ImageAdapter 内で行います。getView メソッド内から別のスレッドを呼び出しますか?

Aquery はダウンロードを行うために別のスレッドを開始しているため、既にあるコードを複製するだけです。BitmapAjaxCallback.callbackそのスレッドがその仕事を終えたときに呼び出されます。

getView() メソッドが 2 回呼び出されます。呼び出しに基づいてトラックが複数回再生されるため、1 回だけ呼び出されるように制御できますか?

getView2 回呼び出す必要があります。最初の呼び出しはView、ネットワークから画像をダウンロードせずに返されます。2 番目の呼び出しは、イメージがダウンロードされ、添付できるようになった後で行われます。メモリキャッシュに画像が既にある場合にのみ、getView一度呼び出されます。不要なものはBitmapAjaxCallback.callback2 回呼び出されます。

また、画像のダウンロードが完了した後、メインスレッドで mp3 をダウンロードしています。どちらも別々のスレッドでダウンロードする必要があります。そして同時に。

ソリューション提案:

AdapterコンテキストにバインドされているためActivity、画像と mp3 のダウンロードと再生の開始は、その短命のコンテキストにバインドされるべきではありません。コンテキストに移動するApplicationService、コンテキストに移動するAdapterだけで、実行することを要求し、キャッシュから画像を取得する必要があります。これはApplicationコンテキストに配置する必要があります。 . Aquery には、使用できるキャッシュがあるかもしれません。

于 2013-05-09T09:00:14.967 に答える