gpt4 book ai didi

android - 快速滚动 recyclerView 列表时,RecyclerView 内的 NetworkImageView 有时不会加载图像。 Volley 网络响应缓慢

转载 作者:行者123 更新时间:2023-11-29 01:13:16 25 4
gpt4 key购买 nike

我有一个 RecyclerView。

<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>

我将 CardView 作为我的 RecyclerView 的列表项

<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="vertical"
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/networkImageView"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:layout_width="match_parent"
android:layout_height="130dp"/>
</android.support.v7.widget.CardView>

在 recyclerAdapter 的 onBindViewHolder 中,我正在用网络上的图像加载 NetworkImageView

ImageLoader imageLoader =    RequestUtil.getInstance(_context).getImageLoader();
String imageUrl = "http://someinterneturl/asdfaas/dsawes.png"; // I get these URL for images from a service.
networkImageView.setImageUrl(imageUrl,imageLoader);

我有从中获取 ImageLoader 的 RequestUtil 类

public class RequestUtil {

private static RequestUtil _instance;
private RequestQueue _requestQueue;
private static Context _ctx;
private ImageLoader _ImageLoader;
private static final String DEFAULT_CACHE_DIR = "volley";
private static final int DEFAULT_NETWORK_THREAD_POOL_SIZE = 8;

private RequestUtil(Context context) {
_ctx = context;
}

public static synchronized RequestUtil getInstance(Context context) {
if(_instance == null) {
_instance = new RequestUtil(context);
}

return _instance;
}

public RequestQueue getRequestQueue() {
if(_requestQueue == null) {
//_requestQueue = Volley.newRequestQueue(_ctx.getApplicationContext());
_requestQueue = getNewRequestQueue();
}

return _requestQueue;
}

public <T> void addToRequestQueue(Request<T> request) {
getRequestQueue().add(request);
}

public ImageLoader getImageLoader() {

if (_ImageLoader == null) {
_ImageLoader = new ImageLoader(this.getRequestQueue(),
new LruBitmapCacheUtil());
}
return this._ImageLoader;
}

private RequestQueue getNewRequestQueue(){
Context context = _ctx.getApplicationContext();
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
HttpStack stack= new HurlStack();
Network network = new BasicNetwork(stack);
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network,DEFAULT_NETWORK_THREAD_POOL_SIZE);
queue.start();
return queue;

}

这很好用,但是当我快速滚动 RecyclerViewList 时,有时在屏幕上的一个 NetworkImageView 中图像不会加载。我在 android studio 中看到以下几个日志

W/art: Long monitor contention with owner Thread-6 (8925) at com.android.volley.Response com.android.volley.toolbox.ImageRequest.parseNetworkResponse(com.android.volley.NetworkResponse)(ImageRequest.java:124) waiters=5 in com.android.volley.Response com.android.volley.toolbox.ImageRequest.parseNetworkResponse(com.android.volley.NetworkResponse) for 279ms

大多数时候,即使是显示的这些图像,我也会看到以下日志。

D/Volley: [416] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] "http://someinterneturl/asdfaas/dsawes.png" 0xe48e98af LOW 249> [lifetime=10978], [size=867672], [rc=200], [retryCount=2]

请通过在滚动停止时加载所有图像并从日志中删除上述两个警告来帮助我解决此问题。如果您需要更多信息,请与我们联系。

最佳答案

我在之前的项目中遇到了同样的问题,用 Picasso 替换了 volley 库。

它的工作就像一个魅力,它可以很好地将下载的图像映射到相应的 View ,并且还优化了缓存技术。

引用http://square.github.io/picasso/使用和完整教程。

希望对您有所帮助。

关于android - 快速滚动 recyclerView 列表时,RecyclerView 内的 NetworkImageView 有时不会加载图像。 Volley 网络响应缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41530571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com