Volley - NetworkImageView有时候无法显示错误图片?

3
所以我决定尝试使用新的Volley库,就像Google IO 2013上展示的那样。我在使用NetworkImageView作为解决方案以在GridView上显示多张图片时进行了尝试。它可以显示图像,并且效果很好,但是如果我在下载过程中关闭WiFi,它不会显示任何错误,就像所有的东西仍在加载一样。更糟糕的是,如果我恢复连接,它也不会继续加载。这是为什么?该如何解决?也许这实际上是一个错误? 如果有人想尝试,这是我的示例代码(BitmapCacheLru代码 here):
public class MainActivity extends Activity {
    private static final int COLUMNS_COUNT = 4;
    private RequestQueue _requestQueue;
    private ImageLoader _imageLoader;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        _requestQueue=Volley.newRequestQueue(this);
        _imageLoader=new ImageLoader(_requestQueue, new BitmapLruCache());

        final GridView gridView = new GridView(this);
        gridView.setNumColumns(COLUMNS_COUNT);
        final int screenWidth = getResources().getDisplayMetrics().widthPixels;

        gridView.setAdapter(new BaseAdapter() {
            @Override
            public View getView(final int position, final View convertView, final ViewGroup parent) {
                NetworkImageView rootView = (NetworkImageView) convertView;

                if (rootView == null) {
                    rootView = new NetworkImageView(MainActivity.this);
                    rootView.setLayoutParams(new AbsListView.LayoutParams(screenWidth / COLUMNS_COUNT, screenWidth / COLUMNS_COUNT));
                    rootView.setScaleType(ScaleType.CENTER_CROP);
                    rootView.setDefaultImageResId(android.R.drawable.sym_def_app_icon);
                    rootView.setErrorImageResId(android.R.drawable.ic_dialog_alert);
                }

                final String url = getItem(position);
                rootView.setImageUrl(url, _imageLoader);
                return rootView;
            }

            @Override
            public long getItemId(final int position) {
                return 0;
            }

            @Override
            public String getItem(final int position) {
                return Images.imageThumbUrls[position];
            }

            @Override
            public int getCount() {
                return Images.imageThumbUrls.length;
            }
        });

        setContentView(gridView);
    }

    @Override
    protected void onStop() {
        _requestQueue.cancelAll(this);
        super.onStop();
    }
}

附注:如果您想查看NetworkImageView的代码,我认为可以在这里找到。


查看Logcat,在关闭Wifi时,Volley是否有任何错误/调试消息? - Ognyan
实际上我还没有检查过。Volley有一个特殊的日志标签可以查找吗? - android developer
没错,正如你所猜的那样,它就是“Volley” :-) - Ognyan
1个回答

5
我认为问题在于volley不会帮助您重新加载图像。
快速检查显示,NetworkImageView仅在调用onLayout方法时加载数据,并且如果需要,loadImageIfNecessary方法将排队网络请求。
当没有Internet连接时,将调用错误回调,并且一旦Internet自己连接,就不会采取进一步的措施。
然而,由于您在列表中有NetworkImage,在滚动列表时,我想您将重用单元格视图并再次调用setImageURL。 如果有可用的互联网连接,则图像将自动加载。 或者,一旦Internet连接正常,您可以刷新列表视图,以使图像自动加载。

1
那这就是一个 bug,对吧?如果是的话,在代码中我应该怎么做来修复它呢?我提供的最新链接修改起来好用吗? - android developer
尚未测试,但我认为你应该自己监听网络变化并在用户连接后使ListView无效。 - Maarten
@zhaocong 当我滚动ListView并返回时,一些在加载时显示的图像会消失。为什么会这样? - Roon13
@Roon13,恐怕我可能不理解你的问题。通常情况下,当您向后滚动时,缓存的图像应立即出现,除非它们根本没有被缓存。 - zhaocong
没关系,我解决了我的问题。谢谢你的时间。 - Roon13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接