Volley 使用 StringRequest 在第一次后不调用 getParams 发送 POST 请求参数
Posted
技术标签:
【中文标题】Volley 使用 StringRequest 在第一次后不调用 getParams 发送 POST 请求参数【英文标题】:Volley using StringRequest not calling getParams for sending POST Request Parameters after 1st time 【发布时间】:2018-06-16 01:03:47 【问题描述】:我面临的问题是我的POST
请求参数在第一次后不会发送到服务器。我知道Volley
正在使用缓存机制进行响应,但在我的情况下,我的请求参数值可以在运行时更改,因为我在Recyclerview
中使用分页。
所以我的问题是我怎样才能每次都发送 Post 请求参数并且不会松动 volley
的缓存机制。
我尝试过使用下面的方法并完成我的工作(每次都调用 getParams()
).. 但它会丢失缓存响应,我不希望这样。
requestQueue.getCache().clear();
stringRequest.setShouldCache(false);
还搜索了谷歌和下面的链接,但找不到任何合适的解决方案。以下是SO链接
Volley not calling getParams() for second time Volley not calling getParams() android volley does not calling getParams in POST request Volley not calling getParams() for standard POST request下面是我的代码:
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>()
@Override
public void onResponse(String response)
Log.e("RES", response);
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setDateFormat("M/d/yy hh:mm a"); //Format of our JSON dates
Gson gson = gsonBuilder.create();
NewsFeedPOJO resultObj = (NewsFeedPOJO) gson.fromJson(response, (Class) NewsFeedPOJO.class);
inCurrPage = Integer.parseInt(resultObj.getPagination().getCurrent_page());
inTotalPage = Integer.parseInt(resultObj.getPagination().getTotal_pages());
inCurrPage++;
arrayList.addAll(resultObj.getNewsFeedList());
if (isFtym)
isFtym = false;
layoutManager = new LinearLayoutManager(MainActivity.this);
rcNewsFeed.setLayoutManager(layoutManager);
adapter = new NewsFeedAdapter(MainActivity.this, arrayList);
rcNewsFeed.setAdapter(adapter);
else
adapter.notifyItemInserted(arrayList.size());
adapter.notifyDataSetChanged();
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
)
@Override
protected Map<String, String> getParams() throws AuthFailureError
Map<String, String> map = new HashMap<>();
map.put("user_id", "188");
if (inCurrPage == 0)
map.put("page", "1");
else
map.put("page", "" + inCurrPage);
Log.e("RES", inCurrPage + " PARA");
return map;
;
//RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
//requestQueue.add(stringRequest);
//requestQueue.getCache().clear();
//AppController.getInstance().addToRequestQueue(stringRequest);
// stringRequest.setShouldCache(false);
VolleySingleton.getInstance(this).addToRequestQueue(stringRequest);
使用下面的 Volley Dependency。
compile 'com.android.volley:volley:1.1.0'
如果需要更多信息,请告诉我。提前致谢。您的努力将不胜感激。
【问题讨论】:
不确定 Volley,但 square.github.io/retrofit 确实可以处理这些情况。它比 Volley 更加巩固和高效。查看这些比较instructure.github.io/blog/2013/12/09/volley-vs-retrofit 如果您想检索下一页,您应该向队列中添加一个新请求。不重用现有请求 您是否尝试过以下链接。 ***.com/q/36288500/4140857 你使用过request.setRetryPolicy(new DefaultRetryPolicy(SERVER_TIMEOUT, MAX_RETRY, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 其中 MaxRetry 为 0,1 或任何您想要重复调用的值,默认为 1 【参考方案1】:你检查过你的 Volley Singleton 吗?
import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class VolleySingleton
private static AppSingleton mAppSingletonInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static Context mContext;
private AppSingleton(Context context)
mContext = context;
mRequestQueue = getRequestQueue();
mImageLoader = new ImageLoader(mRequestQueue,
new ImageLoader.ImageCache()
private final LruCache<String, Bitmap>
cache = new LruCache<String, Bitmap>(20);
@Override
public Bitmap getBitmap(String url)
return cache.get(url);
@Override
public void putBitmap(String url, Bitmap bitmap)
cache.put(url, bitmap);
);
public static synchronized AppSingleton getInstance(Context context)
if (mAppSingletonInstance == null)
mAppSingletonInstance = new AppSingleton(context);
return mAppSingletonInstance;
public RequestQueue getRequestQueue()
if (mRequestQueue == null)
// getApplicationContext() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
return mRequestQueue;
public <T> void addToRequestQueue(Request<T> req,String tag)
req.setTag(tag);
getRequestQueue().add(req);
public ImageLoader getImageLoader()
return mImageLoader;
public void cancelPendingRequests(Object tag)
if (mRequestQueue != null)
mRequestQueue.cancelAll(tag);
或者您的代码中可能还有其他问题...
【讨论】:
以上是关于Volley 使用 StringRequest 在第一次后不调用 getParams 发送 POST 请求参数的主要内容,如果未能解决你的问题,请参考以下文章
Volley 使用 StringRequest 在第一次后不调用 getParams 发送 POST 请求参数
Android-Volley网络通信框架(StringRequest & JsonObjectRequest)
android volley stringrequest post中的getparams怎么把json数据提交上去