Android在Gallery中显示需要从Internet下载的图像

时间:2011-07-03 05:10:56

标签: android gallery android-asynctask

我正在编写一个应用程序,我需要在其中显示来自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}}

2 个答案:

答案 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实现。