关于 android:Volley – NetworkImageView 有时不显示错误图像?

Volley - NetworkImageView sometimes doesn't show the error image?

所以我决定试用 Google IO 2013 上显示的新 Volley 库。

我已经尝试过使用 NetworkImageView 的简单解决方案在 GridView 上显示多个图像。

它运行良好并显示图像,但如果我让它下载图像,然后在下载过程中关闭 WiFi,它不会显示错误,就好像一切仍在加载一样。不仅如此,如果我恢复连接,它不会恢复加载。

为什么会发生,我该如何解决?也许它实际上是一个错误?

这是我的示例代码,如果有人想试试的话(BitmapCacheLru 代码在这里):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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的代码,我想这里有。


我认为问题在于凌空无法帮助您重新加载图像。

快速检查表明 NetworkImageView 仅在调用 onLayout 方法时加载数据,并且方法 loadImageIfNecessary 将在必要时将网络请求排队。

当没有 Internet 连接时,将调用错误回调,并且一旦 Internet 自身连接就没有进一步的操作。

但是,由于列表中有 NetworkImage,因此当您滚动列表时,我想您将重用单元格视图并再次调用 setImageURL。如果 Internet 连接可用,图像将自动加载。或者,一旦 Internet 连接建立,您可以刷新列表视图,以便自动加载图像。