Android показывает изображение в галерее, которое необходимо загрузить из Интернета - PullRequest
3 голосов
/ 03 июля 2011

Я пишу приложение, в котором мне нужно показывать изображения с URL.Теперь предположим, что мне нужно показать 100 изображений, одно за другим, и каждую фотографию нужно загрузить из Интернета.

Я использую представление галереи для отображения изображений, но проблема в том, что когда я передаю URL-адрес функции getView, она начинает загрузку всех 100 изображений (да, только в асинхронной задаче), но загружает 100 изображенийзамедляет работу системыЧего я хочу добиться, так это то, что когда я двигаюсь правильно, моя программа должна выбрать URL-адрес и загрузить его из Интернета.

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 вызывается, как только действиезагружен для всех URL-адресов, присутствующих в GalleyList, что замедляет работу системы


@ cyngus: я пытался использовать ваш ответ ... но теперь уверен, как это использовать ..

Я создал объект executor в соответствии с вашими предложениями

    Executor e = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE,
            TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

Но я не могу выяснить, как использовать это для вызова моей асинхронной задачи (BitmapDownloaderTask)

    BitmapDownloaderTask task = new BitmapDownloaderTask(con,showDialog,i,path);
    task.execute(url,null,null);

My AsynЗадача

    private class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
    }

Ответы [ 2 ]

0 голосов
/ 11 июля 2011

Я думаю, что ленивая загрузка может решить вашу проблему.Взгляните на ссылку Ленивая загрузка изображений в ListView Это сделано для просмотра списка в этом примере, но также может быть реализовано с помощью gridview.

0 голосов
/ 07 июля 2011

По умолчанию Executor для AsyncTask - ThreadPoolExecutor, в котором используется LinkedBlockingQueue, емкость которого ограничена 10 элементами.Это означает, что как только очередь необработанной очереди достигает 10 элементов, 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>());

Тогда вы можете позвонить AsyncTask.executeOnExecutor().Это будет использовать неограниченную очередь, которая , возможно, не совсем то, что вы хотите, или лучше всего подходит для всех возможных вариантов использования, но она должна поддерживать количество рабочих потоков на уровне 5 и ограничивать замедление, которое вы видите.

...