gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:43:37 25 4
gpt4 key购买 nike

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

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

image file -> http://myserver.com/img1.png

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

最佳答案

Two async calls in getview(), am I doing this right?

没有。

I do this whole thing inside my custom ImageAdapter. Shall I call another thread from within my getView method ?

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

The getView() method gets called 2 times can I control it to get called only once because it shouldn't as the track gets played multiple times based on its call?

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

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

解决方案:

由于您的 Adapter 绑定(bind)到 Activity 上下文并且下载图像和 mp3 并开始播放不应该绑定(bind)到那个短暂的上下文,将它移动到 Application context 或 ServiceAdapter 只请求完成的事情并从缓存中获取图像,这应该放在 Application 中语境。也许 Aquery 有一些您可以使用的缓存。

关于android - getview() 中的两个异步调用,我这样做对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16456812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com