为了账号安全,请及时绑定邮箱和手机立即绑定

在异步堆栈中加载位图时出现问题

在异步堆栈中加载位图时出现问题

动漫人物 2022-09-22 13:55:36

我成功地解析了xml,并从标签和属性中获取了文本和URL。文本我已成功设置到我的列表视图中,但我无法将我的位图加载到图像视图中。我想我忘记了一些小事,比如某个地方的转换,或者我写错了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);

也许我必须在“执行后”()方法上添加(覆盖)?但是我需要在那里做什么呢?



查看完整描述

2 回答

?
喵喵时光机

TA贡献1499条经验 获得超7个赞

您可以执行一些操作,例如在构造函数中将图像视图传递到异步任务中。为此,首先修改您的异步任务,如下所示:


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;


查看完整回答
反对 回复 2022-09-22
?
慕运维8079593

TA贡献1564条经验 获得超5个赞

试试这个代码


protected void onPostExecute(Bitmap bitmap) {

        runOnUiThread(new Runnable() {

            @Override

            public void run() {

                mImageView.setImageBitmap(bitmap);

            }

        });

}


查看完整回答
反对 回复 2022-09-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信