【问题标题】:Issue while loading Bitmap in AsyncTack在 AsyncTack 中加载位图时出现问题
【发布时间】:2019-08-27 03:18:09
【问题描述】:

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

但这是错误的。

【问题讨论】:

  • 为什么不投票?如果这个问题之前在 stackoverflow 上解决了,请给我一个链接。

标签: java android asynchronous bitmap android-asynctask


【解决方案1】:

您可以在构造函数中执行类似将 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;

【讨论】:

  • 只是在尝试这个并得到:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference 在这个字符串上mimageView.setImageBitmap(bitmap);
  • 哦,我明白这个问题,我正在做myBitmap = new AsyncForBitmap(IV).execute(iconsrcVALUE).get(); 而不是你的new AsyncForBitmap(IV).execute(iconsrcVALUE),因为我需要在我的case XmlPullParser.END_TAG: 中完成items.add(new SomeItem(tagtext, myBitmap));
  • @AlexanderVasilchuk 看起来像在 AsyncTask 构造函数参数中传递的 imageView 为空。检查该视图是否已正确初始化。
  • 这里myBitmap 为空。
  • 那么为什么我不能在 myBitmap = new AsyncForBitmap(IV).execute(iconsrcVALUE).get(); 中使用 myBitmap 变量 programmes.add(new SomeItem(tagtext, myBitmap)); 呢?
【解决方案2】:

试试这个代码

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

【讨论】:

  • 得到相同的null object reference,请检查我的 cmets 给用户 Chintan Soni
  • 为什么我不能做 myBitmap = new AsyncForBitmap(IV).execute(iconsrcVALUE).get();在programs.add(new SomeItem(tagtext, myBitmap))中使用myBitmap变量; ?
猜你喜欢
  • 1970-01-01
  • 2020-11-26
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多