gpt4 book ai didi

Android Volley 一个请求返回两次结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:50:55 26 4
gpt4 key购买 nike

两天来我一直在努力解决这个问题,但我完全被难住了。出于某种原因,我向队列发送了一个请求,但 volley 将它返回了两次,这两次调用了监听器并将 ListView 中的结果加倍。我打开了 Volley 的日志记录,我可以看到请求被添加到队列并返回,然后几秒钟后同样的请求也被返回。在下方登录

V/Volley(14666): [188] CacheDispatcher.run: start new dispatcher
11-15 12:29:30.152: V/Volley(14666): [1] RequestQueue.add: Request for cacheKey=http://reallylongurl is in flight, putting on hold.
11-15 12:29:39.722: V/Volley(14666): [1] RequestQueue.finish: Releasing 1 waiting requests for cacheKey=http://reallylongurl.
11-15 12:29:39.722: D/Volley(14666): [1] MarkerLog.finish: (9809 ms) [ ] http://reallylongurl 0xd68d6603 NORMAL 1
11-15 12:29:39.732: D/Volley(14666): [1] MarkerLog.finish: (+0 ) [ 1] add-to-queue
11-15 12:29:39.732: D/Volley(14666): [1] MarkerLog.finish: (+2169) [188] cache-queue-take
11-15 12:29:39.742: D/Volley(14666): [1] MarkerLog.finish: (+37 ) [188] cache-hit
11-15 12:29:39.742: D/Volley(14666): [1] MarkerLog.finish: (+6878) [188] cache-hit-parsed
11-15 12:29:39.742: D/Volley(14666): [1] MarkerLog.finish: (+0 ) [188] post-response
11-15 12:29:39.752: D/Volley(14666): [1] MarkerLog.finish: (+725 ) [ 1] done

A few other requests get queued here.

11-15 12:29:48.405: D/Volley(14666): [1] MarkerLog.finish: (18302 ms) [ ] http://reallylongurl 0xd68d6603 NORMAL 2
11-15 12:29:48.412: D/Volley(14666): [1] MarkerLog.finish: (+0 ) [ 1] add-to-queue
11-15 12:29:48.412: D/Volley(14666): [1] MarkerLog.finish: (+15164) [188] cache-queue-take
11-15 12:29:48.412: D/Volley(14666): [1] MarkerLog.finish: (+220 ) [188] cache-hit
11-15 12:29:48.432: D/Volley(14666): [1] MarkerLog.finish: (+2299) [188] cache-hit-parsed
11-15 12:29:48.432: D/Volley(14666): [1] MarkerLog.finish: (+0 ) [188] post-response
11-15 12:29:48.442: D/Volley(14666): [1] MarkerLog.finish: (+619 ) [ 1] done

如您所见,它从来没有说添加了另一个请求,也没有说有一个请求正在进行中。如果我清除缓存,我会得到相同的结果,只是第一个请求来自网络,第二个请求从缓存返回。我已经尝试调试和单步执行我的代码,但我从未看到请求被多次排队。有没有人见过这个?我还应该看看其他什么地方吗?

谢谢

编辑:这是我启动 volley 以及调用它的代码。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

if (savedInstanceState == null) {

TextView emptyView = new TextView(getActivity());
emptyView.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
emptyView.setText("Loading....");
emptyView.setTextSize(20);
emptyView.setGravity(Gravity.CENTER_VERTICAL
| Gravity.CENTER_HORIZONTAL);

((ViewGroup) mListView.getParent()).addView(emptyView);
mListView.setEmptyView(emptyView);
}

mAdapter = new OttoArrayAdapter(mContext);
mListView.setOnScrollListener(onScrollListener);
mListView.setAdapter(mAdapter);

String url = Util.getURL("", mContext);

HttpRequest request = new HttpRequest(url);
request.setTag(mContext);

VolleyLoader.getInstance(mContext).getRequestQueue().add(request);

}



public class VolleyLoader {
private static VolleyLoader mInstance = null;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;

private VolleyLoader(Context context) {

OkHttpStack stack = new OkHttpStack();
mRequestQueue = Volley.newRequestQueue(context, stack);
mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache(
Util.getCacheSize(context)));
}

public static VolleyLoader getInstance(Context context) {
if (mInstance == null) {
mInstance = new VolleyLoader(context);
}
return mInstance;
}

public RequestQueue getRequestQueue() {
return this.mRequestQueue;
}

public ImageLoader getImageLoader() {
return this.mImageLoader;
}

}

最佳答案

我相信我在多步执行代码后已经弄清楚了。我相信是 softttl 导致了这种行为。在 Volley 缓存分配器中

            if (!entry.refreshNeeded()) {
// Completely unexpired cache hit. Just deliver the response.
mDelivery.postResponse(request, response);
} else {
// Soft-expired cache hit. We can deliver the cached response,
// but we need to also send the request to the network for
// refreshing.
request.addMarker("cache-hit-refresh-needed");
request.setCacheEntry(entry);

// Mark the response as intermediate.
response.intermediate = true;

// Post the intermediate response back to the user and have
// the delivery then forward the request along to the network.
mDelivery.postResponse(request, response, new Runnable() {
@Override
public void run() {
try {
mNetworkQueue.put(request);
} catch (InterruptedException e) {
// Not much we can do about this.
}
}
});

这会发布响应,然后将其发送到网络,网络会向同一个监听器发布另一个响应。

关于Android Volley 一个请求返回两次结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20027995/

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