在 AsyncTack 中加载位图时出现问题

Issue while loading Bitmap in AsyncTack

我已成功解析 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);

我的异步任务:

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);
        }

但这是错误的。

您可以执行一些操作,例如在构造函数中将 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;

试试这个代码

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