Проблема при загрузке растрового изображения в AsyncTack - PullRequest
0 голосов
/ 05 апреля 2019

Я успешно проанализировал xml и получил текст и URL из тегов и атрибутов.Текст Я был успешно установлен в свой ListView, но я не могу загрузить свое растровое изображение в ImageView.Я думаю, что забыл что-то маленькое, например, какое-то преобразование где-то, или я написал неправильный AsyncTask.

Вот мой анализ и вызов AsyncTask:

    private List<SomeItem> items = new ArrayList();

listView = findViewById(R.id.listView);
        IV = findViewById(R.id.iconsrc);

        ArrayList<String> list = new ArrayList<>();
        try {
            XmlPullParser parser = getResources().getXml(R.xml.myxml);

            while (parser.next() != XmlPullParser.END_DOCUMENT) {
                tagname = parser.getName();
                switch (parser.getEventType()){

                    case XmlPullParser.START_TAG:
                        if (tagname != null && tagname.equals(iconsrc)){
                            iconsrcVALUE = parser.getAttributeValue(0);
                            myBitmap = new AsyncForBitmap().execute(iconsrcVALUE).get();
                            IV.setImageBitmap(myBitmap);
                        }

                        break;

                    case XmlPullParser.TEXT :
                        tagtext = parser.getText();
                         break;

                    case XmlPullParser.END_TAG:

                        if (tagname != null && tagname.equals(displayname)) {

                            programmes.add(new SomeItem(tagtext, myBitmap));
                        }

                        break;
                }
            }

        } catch (Throwable t) {
            Toast.makeText(this,
                    "Error while loading xml document: " + t.toString(), Toast.LENGTH_LONG)
                    .show();
        }

        SomeAdapter adapter = new SomeAdapter(this, R.layout.list_item, items);
        listView.setAdapter(adapter);

Мой AsyncTask:

class AsyncForBitmap extends AsyncTask<String, Void, Bitmap> {
        private Exception exception;

        protected Bitmap doInBackground(String... urls) {
            try {
                URL url=new URL(urls[0]);
                Bitmap bitmap = BitmapFactory.decodeStream((InputStream)url.getContent());
                return bitmap;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
}

Может быть, я должен добавить (перезаписать) метод onPostExecute ()?Но что мне нужно там делать?

Я пробовал что-то вроде:

protected void onPostExecute(Bitmap bitmap) {
            IV.setImageBitmap(bitmap);
        }

Но это неправильно.

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Вы можете сделать что-то вроде передачи ImageView в AsyncTask в конструкторе. Для этого сначала измените AsyncTask, как показано ниже:

class AsyncForBitmap extends AsyncTask<String, Void, Bitmap> {

    private final ImageView mImageView;

    public AsyncForBitmap(ImageView imageView){
        mImageView = imageView;
    }

    private Exception exception;

    protected Bitmap doInBackground(String... urls) {
        try {
            URL url=new URL(urls[0]);
            Bitmap bitmap = BitmapFactory.decodeStream((InputStream)url.getContent());
            return bitmap;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(Bitmap bitmap){
        mImageView.setImageBitmap(bitmap);
    }

}

А затем просто сделайте как:

 ...
 case XmlPullParser.START_TAG:
     if (tagname != null && tagname.equals(iconsrc)){
        iconsrcVALUE = parser.getAttributeValue(0);
        new AsyncForBitmap(IV).execute(iconsrcVALUE);
     }
     break;
0 голосов
/ 05 апреля 2019

попробуйте этот код

protected void onPostExecute(Bitmap bitmap) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mImageView.setImageBitmap(bitmap);
            }
        });
}
...