我正在编写一个应用程序,我需要在其中显示来自URL的图像。现在假设我必须一个接一个地显示100张图片,并且每张照片都需要从互联网上下载。
我正在使用图库视图来显示图像,但问题是当我将URL传递给getView
函数时,它开始下载所有100个图像(仅在异步任务中是),但下载100个图像速度慢在系统中。我想要实现的是,当我向右移动时,我的程序应该选择网址并从互联网上下载。
public class ViewImage extends Activity {
private String albumID;
private ArrayList<MediaBO>galleryList;
private Context context;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.localgallery);
this.context = this;
Intent intent = getIntent();
Bundle extras = intent.getExtras();
albumID = extras.getString("albumID");
int position = extras.getInt("position"); //position of the image selected
DataBaseOperation dataBaseOperation = new DataBaseOperation(this);
galleryList = dataBaseOperation.queryAllPhoto(albumID); //this returns the list of Photos needs to be shown.it has the URL of the photos
Gallery g = (Gallery) findViewById(R.id.localGallery);
g.setAdapter(new ImageAdapter(this));
g.setSelection(position);
}
public class ImageAdapter extends BaseAdapter{
private Context mContext;
int mGalleryItemBackground;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount(){
return galleryList.size();
}
public Object getItem(int position){
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent){
ImageView i = new ImageView(mContext);
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.localgallery, null);
}
String url = galleryList.get(position).getUrl();
DOWNLOAD()//download the photo using Async Task
v = i;
return v;
}
}
}
现在问题是getview
一旦为GalleyList
中存在的所有URL加载活动就会调用 Executor e = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
@cyngus:我试图用你的答案..但现在确定如何使用这个..
我按照你的建议创建了执行器对象
BitmapDownloaderTask task = new BitmapDownloaderTask(con,showDialog,i,path);
task.execute(url,null,null);
但是我无法找到如何使用它来调用我的异步任务(BitmapDownloaderTask)
private class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
}
我的Asyn任务是
{{1}}
答案 0 :(得分:0)
AsyncTask的默认Executor
是使用ThreadPoolExecutor
的{{1}},其容量限制为10个项目。这意味着一旦队列未处理队列达到10个项目,LinkedBlockingQueue
就会开始添加线程,因为它无法向工作队列添加更多项目。如果您想阻止这种情况,可以创建自己的Executor
。
Executor
然后你可以致电// same values as the default implementation in AsyncTask
int CORE_POOL_SIZE = 5;
int MAX_POOL_SIZE = 128;
int KEEP_ALIVE = 1;
Executor e = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
。这将使用一个无界的队列,可能不是你想要的或最适合所有可能的用例,但它应该将工作线程的数量保持在5并限制你看到的减速。 / p>
答案 1 :(得分:0)
我认为延迟加载可以解决您的问题。看看链接Lazy load of images in ListView这是针对此示例中的listview完成的,但也可以使用gridview实现。