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

Posted

技术标签:

【中文标题】在 AsyncTack 中加载位图时出现问题【英文标题】:Issue while loading Bitmap in 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);
        

但这是错误的。

【问题讨论】:

为什么不投票?如果这个问题之前在 *** 上解决了,请给我一个链接。 【参考方案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变量; ?

以上是关于在 AsyncTack 中加载位图时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot / FreeMarker 中加载图像时出现问题

iphone - 在视图控制器中加载表格视图时出现问题

在 Monogame 中加载内容时出现 ArgumentNullException

在 django 开发中加载静态文件时出现 404 错误

在核心数据项目中加载视图控制器时出现问题

在 Firebase Crashlytics 仪表板中加载您的问题时出现 iOS 错误