Позвоните в AsyncTask из пользовательского адаптера - PullRequest
0 голосов
/ 17 декабря 2018

Я создал список с пользовательским адаптером.Одним из полей является изображение для отображения аватара каждого пользователя.Я должен получить эти изображения из URL.

Я создал класс, который преобразует изображение из URL в растровое изображение.

Я думаю, что это должно быть сделано из асинхронной задачи.Проблема в том, что я не знаю, как вызвать этот метод из пользовательского адаптера.

Это мой класс:

private class obtAvatar2 extends AsyncTask<Void , Void, Bitmap>{
    Bitmap bm;

    @Override
    protected Bitmap doInBackground(Void... voids) {
        try {

            URL url = new URL("https://www.bellatores.cl/wp-content/uploads/2018/01/Avatar-Mujer.png");
            URLConnection con = url.openConnection();
            con.connect();
            InputStream is = con.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();

        }catch (IOException e){

        }

        return bm;
    }
}

Это возвращает битовую карту.Затем из моего пользовательского адаптера мне нужно поместить это растровое изображение в ImageView

, например, я пытаюсь:

ImageView avatarView = (ImageView)view.findViewById(R.id.imageViewAvatarMensa);
avatarView.setImageBitmap(new obtAvatar2().execute());

Но, это неправильно: (

любой совет?

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Вы можете использовать Glide или Picasso .Так как это очень полезные библиотеки для установки изображения в адаптере (здесь представления можно использовать многократно).

Если вы все еще хотите использовать asynctask, проверьте ниже:

В адаптере каждый раз прокрутка приведет к новомусетевой вызов, которого можно избежать, используя сохранение растрового объекта.

Вы пытаетесь получить изображение, используя следующий код:

ImageView avatarView = (ImageView)view.findViewById(R.id.imageViewAvatarMensa);
avatarView.setImageBitmap(new obtAvatar2().execute());

Это не будет работать как:

new obtAvatar2().execute()

Он будет выполняться в фоновом режиме и возвращать ответ в onPostExucute () .И результат:

avatarView.setImageBitmap(null)

Если вы хотите использовать asytask , то, вероятно, вам нужно сделать ваш код следующим образом:

private class obtAvatar2 extends AsyncTask<Void, Void, Bitmap> {
        Bitmap bm;

        @Override
        protected Bitmap doInBackground(Void... voids) {
            try {

                URL url = new URL("https://www.bellatores.cl/wp-content/uploads/2018/01/Avatar-Mujer.png");
                URLConnection con = url.openConnection();
                con.connect();
                InputStream is = con.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                bm = BitmapFactory.decodeStream(bis);
                bis.close();
                is.close();

            } catch (IOException e) {

            }

            return bm;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            ImageView avatarView = (ImageView)view.findViewById(R.id.imageViewAvatarMensa);
                avatarView.setImageBitmap(bitmap);
                //set bitmap to imageview and save in local list, so in future no need to download
            }
        }

Вы можете передать ссылку ImageView в конструкторе.

0 голосов
/ 17 декабря 2018

Прежде всего вы должны добавить асинхронную задачу obtAvatar2 в свой пользовательский адаптер.

Я надеюсь, что вы используете ViewHolder в вашем привычном адаптере, затем в getView (), прежде чем присваивать значение вашему Imageview, вызовите асинхронный вызовзадача.Например:

 public static class ViewHolder {

    public ImageView display_adImage;

}

public View getView(final int position, View convertView, ViewGroup parent) {
    View vi = convertView;

    try {
        if (convertView == null) {

            vi = inflater.inflate(R.layout.test_layout, null);
            holder = new ViewHolder();

            holder.display_adImage = vi.findViewById(R.id.IvAdImage);


            vi.setTag(holder);
        } else {
            holder = (ViewHolder) vi.getTag();
        }

        ...


        Bitmap b =  new GetImageTask().execute().get();
    holder.display_adImage.setImageBitmap(b);
}
}

 private class obtAvatar2 extends AsyncTask<Void , Void, Bitmap>{
Bitmap bm;

@Override
protected Bitmap doInBackground(Void... voids) {
    try {

        URL url = new URL("https://www.bellatores.cl/wp-content/uploads/2018/01/Avatar-Mujer.png");
        URLConnection con = url.openConnection();
        con.connect();
        InputStream is = con.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        bm = BitmapFactory.decodeStream(bis);
        bis.close();
        is.close();

    }catch (IOException e){

    }

    return bm;
}

}

0 голосов
/ 17 декабря 2018

Я предлагаю вам поработать с библиотеками Glide или Picasso, они являются наиболее используемой библиотекой изображений в приложениях для Android:

Чтобы импортировать в ваш проект gradle:

PICASSO :

dependencies {
    compile 'com.squareup.picasso:picasso:2.5.1'
}

GLIDE :

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.2'
}

Использование:

PICASSO :

Picasso.with(myFragment)
    .load(url)
    .into(myImageView);

GLIDE :

Glide.with(myFragment)
    .load(url)
    .into(myImageView);

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...