在 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 中加载图像时出现问题