我有一款适用于手机和平板电脑的原生Android应用。有问题的API调用是一个GET请求,它在请求标头中使用基本身份验证来发送用户登录详细信息。
当我按下按钮发送API调用时,调试显示请求对象被正确创建并添加到请求队列但没有任何反应。
我检查了服务器日志,API从未进入服务器。在移动设备上完全相同的呼叫工作正常。两个设备都在同一个wifi上,没有使用移动数据,但平板电脑永远不会得到响应,永远不会超时,也不会显示任何错误。
我正在使用凌空进行网络通话。
这是电话会议的代码:
public void GETbasicAuthentication(final String user, final String password, String URL, final VolleySingletonListener<JSONObject> listener, final VolleySingletonErrorListener errorListener) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, URL, new JSONObject(), new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
listener.onResult(response);
BaseActivity.printOut("GETbasic response", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
getErrorCode(error, errorListener);
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("Authorization", String.format("Basic %s", Base64.encodeToString(String.format("%s:%s", user, password).getBytes(), Base64.URL_SAFE)));
params.put("apikey", Constants.API_KEY);
return params;
}
};
requestQueue.add(jsonObjectRequest);
}
/
public interface VolleySingletonListener<T> {
void onResult(T object);
}
public interface VolleySingletonErrorListener {
void onErrorResult(Exception error, JSONObject errorBody);
}
编辑:
根据小提琴的评论,我启用了VolleyLog
并获得了以下内容:
D/Volley: [1] MarkerLog.finish: (143 ms) [ ] **REQUEST_URL** 0x3f39d365 NORMAL 1
D/Volley: [1] MarkerLog.finish: (+0 ) [ 1] add-to-queue
D/Volley: [1] MarkerLog.finish: (+0 ) [114] cache-queue-take
D/Volley: [1] MarkerLog.finish: (+0 ) [114] cache-miss
D/Volley: [1] MarkerLog.finish: (+0 ) [118] network-queue-take
D/Volley: [1] MarkerLog.finish: (+142 ) [118] post-error
D/Volley: [1] MarkerLog.finish: (+1 ) [ 1] done
编辑2:
请求队列在NetworkManager
类中初始化:
private NetworkManager(Context context) {
requestQueue = Volley.newRequestQueue(context.getApplicationContext());
}
public static synchronized NetworkManager getInstance(Context context) {
if (instance == null) {
instance = new NetworkManager(context);
}
return instance;
}
public static synchronized NetworkManager getInstance() {
if (null == instance) {
throw new IllegalStateException(NetworkManager.class.getSimpleName() +
" is not initialized, call getInstance(...) first");
}
return instance;
}
然后在onCreate
类的Application
中调用它:
NetworkManager.getInstance(this);
此外,当要进行API调用时,类的引用如下:
NetworkManager.getInstance().GETbasicAuthentication(...);
查看我的要点,更详细地查看整个单身人士https://gist.github.com/stoddayy/9e5b2cb429274947f8f5839546e05399