问题: 在girdAdapter里的getview使用aquery.id(int id).image(String url, boolean memCache, boolean fileCache, int targetWidth, int fallbackId)这个方法异步下载图片时,imageview无法显示图片
解决问题:
由于AQuery很多都是支持方法链接方式,使得程序调试起来并不是很方便。于是打算直接使用AQuery.ajax()方法,这样程序调试会比较可控。大概代码如下
aq.ajax(url, byte[].class, new AjaxCallback<byte[]>() {
@Override
public void callback(String url, byte[] object, AjaxStatus status) {
viewHolder.imageView.setImageBitmap(BitmapFactory.
decodeByteArray(object, 0,object.length));
}
});
结果:问题还是一样。
调试1:是否是网络问题,导致下载失败
在callback方法中Log.i(“TAG”,”network status==”+status);
日志输出:network status==OK
调试2:是否下载的对象为null,导致什么都不显示
在callback方法中Log.i(“TAG”,”byte[].length==”+object.length);
日志输出:byte[].length==5331
调试3:是否存在不可控的线程问题
在callback方法中判断android当前线程
if (Thread.currentThread() == Looper.getMainLooper().getThread()) {
Log.i("TAG", "in");
} else {
Log.i("TAG", "out");
}
然后,花点时间研究了AQuery:
github上的开源库https://github.com/chunjiangshieh/android-demo-androidquery
AQuery异步请求的Google文档 http://blog.csdn.net/h3c4lenovo/article/details/9069607#t16
解决方案:回到最初的方法,不过参数不同,用AQuery.id(View view),代码如下:
aq.id(viewHolder.imageView).image(item.getImageUrl(),
false, true,0,R.drawable.ic_launcher);
总结:
对于AQuery来说,gridview中子view的id与findviewbyid找到的子view的关系,就有点类似于Java中的类与实例的关系。当使用AQuery.id(int id)绑定视图时,它是找不到对应的view实例的,因此无法显示图片,即使已经通过异步下载下来的了。但是,如果直接手动找到实例,再用上述的方案便能解决问题。 PS:不过这里应该也算是AQuery的一个BUG,出现上述问题,运行程序的时候LogCat并没有报错信息。