我正在尝试使用Volley获取JSON对象以创建动态自动完成,但在使用Volley请求时,我在日志cat中看到:
截击:[486]基本网络。logSlowRequests:请求的HTTP响应=
这些答案并没有解决我的问题。
这里是初始化请求队列的Singleton类:
import android.content.Context;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
public class SingleTon {
private Context context;
private RequestQueue requestQueue;
public static SingleTon singleTon;
public SingleTon(Context context){
this.context=context;
requestQueue=getRequestQueue();
}
private RequestQueue getRequestQueue(){
if(requestQueue==null){
requestQueue= Volley.newRequestQueue(context);
}
return requestQueue;
}
public synchronized static SingleTon getInstance(Context context){
if(singleTon==null){
singleTon=new SingleTon(context.getApplicationContext());
}
return singleTon;
}
public void addToRequestQueue(Request request){
requestQueue.add(request).setRetryPolicy(new DefaultRetryPolicy([I have tried all possible combinations here]));
}
}
发出请求的方法:
public Filter getFilter() {
Filter filter=new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults filterResults=new FilterResults();
if(charSequence!=null){
String partialName=charSequence.toString();
String url="https://api.railwayapi.com/v2/suggest-train/train/"+partialName+"/apikey/xnlo6zq3yj/";
HTTPConnector httpConnector=new HTTPConnector(url,context);
JSONObject response=httpConnector.getJsonResponse();
try {
JSONArray trains=response.getJSONArray("trains");
for(int i=0;i<trains.length();i++){
trainName.add(new Train(trains.getJSONObject(i).getString("number")));
}
} catch (JSONException e) {
e.printStackTrace();
}
filterResults.values=trainName;
filterResults.count=trainName.size();
}
return filterResults;
}
下面是HTTP Connector类:
package com.example.mukhe.dynamicautocomplete;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONObject;
/**
* Created by mukhe on 06-Feb-18.
*/
public class HTTPConnector {
String url;
JSONObject jsonResponse;
Context context;
public HTTPConnector(String url,Context context){
this.url=url;
this.context=context;
}
public JSONObject getJsonResponse() {
makeQuery();
return jsonResponse;
}
private void makeQuery(){
JsonObjectRequest request=new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
jsonResponse=response;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context,"ERROR",Toast.LENGTH_SHORT).show();
Log.d("ERROR: ", error.toString());
}
});
SingleTon.getInstance(context.getApplicationContext()).addToRequestQueue(request);
}
}
你用截击的方式真奇怪。Volley发出异步HTTP请求。这两行代码不会每次都给出结果
HTTPConnector httpConnector=new HTTPConnector(url,context);
JSONObject response=httpConnector.getJsonResponse();
您正在发送async...请求并立即调用getJsonContent
函数?当您调用该函数时,您不能确定是否有可用的响应。当您得到响应时,您应该返回响应,即在JsonObjectRequest
的OnSolutions
方法中
因此,您应该正确地实现HTTPConnector
类和包含getFilter
方法的类之间的通信。
您可以使用这个接口。在HTTPConnector
类中声明接口,并在活动中实现它。
public class HTTPConnector {
String url;
JSONObject jsonResponse;
Context context;
IMyInterface mListener;
public interface IMyInterface
{
void sendResponse(JsonObject obj);
}
public HTTPConnector(String url,Context context,IMyInterface pListener){
this.url=url;
this.context=context;
mListener=pListener
}
public void makeQuery(){
JsonObjectRequest request=new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
jsonResponse=response;
if(mListener!=null)
{
mListener.sendResponse(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context,"ERROR",Toast.LENGTH_SHORT).show();
Log.d("ERROR: ", error.toString());
if(mListener!=null)
{
mListener.sendResponse(null);
}
}
});
SingleTon.getInstance(context.getApplicationContext()).addToRequestQueue(request);
}
}
在你的活动中,实现接口并重写接口的sendSolutions方法。
public class MainActivity extends AppCompatActivity implements HTTPConnector.IMyInterface
{
...........
...........
// Your other code of activity
...........
..........
@Override
public void sendResponse(JsonObject response)
{
try {
JSONArray trains=response.getJSONArray("trains");
for(int i=0;i<trains.length();i++){
trainName.add(new Train(trains.getJSONObject(i).getString("number")));
}
//Now you have response and filled the list, can call getFilter
} catch (JSONException e) {
e.printStackTrace();
}
}
}
在您的活动中的某个地方,当您有URL的查询文本时。如下图所示发出截击请求。
String url="https://api.railwayapi.com/v2/suggest-train/train/"+partialName+"/apikey/xnlo6zq3yj/";
HTTPConnector httpConnector=new HTTPConnector(url,context,this); // this will act as your listener
httpConnector.makeQuery();
每次我尝试用截击的POST方法时,我都会犯严重的错误。我在getCause中得到null值,在getNetworkResponse中得到一些默认值。toString()。 如果我使用GET方法,这工作正常(我从我的网址得到响应)。 有人能帮忙吗?我能做什么? 错误日志: 错误:错误:com.android.volley.服务器错误 更新:networkResponse。statusCode是404
我正在使用截击来管理我的应用程序。有时,当响应很大时,我会在没有太多RAM的设备上获得OOM。我不确定如何解决这个问题。我知道Volley会将其响应存储在内存中,但我的应用程序太多地围绕着Volley,切换起来会很痛苦。我在使用改装时也遇到了问题。我尝试过使用JsonReader,但它似乎仍在发生。我有一个用于截击的自定义请求。它返回一个Gson JsonObject。这是我目前的代码,当响应数据
我想向服务器发送一篇帖子,帖子的正文是真是假。我有这个代码,我使用截击库 ShoozyHeader()将内容类型设置为text/plain,并将Accept设置为text/plain以及身份验证所需的其他标头。 如果我尝试http://requestmaker.com/,服务器正确响应,但我运行此代码,服务器响应: 错误的请求-无效的头HTTP错误400。请求的标头名称无效。 如果删除getBod
我使用反应原生66时运行得到错误 Yarn run v1.22.17$react-原生run-android info运行jetifier将库迁移到AndroidX。您可以使用“--no-jetifier”标志禁用它。Jetifier发现1428个文件要转发jetify。使用4个工作人员... info JS服务器已经运行。信息安装应用程序...配置项目:react-nate-fire base
我想从URL获取一些数据,但服务器速度非常慢。。。因此,每当我使用凌空截击获取数据时,我都会得到TimeOurError,在服务器速度较慢的情况下,我是否可以处理凌空截击应该尝试获取数据多长时间。。。它只需要很少的时间,我也希望不断运行这个请求来检查数据,我计划使用计时器来完成它。。。可以使用计时器连续检查数据吗? 这是我现在的截击请求。。。它适用于其他URL 我需要连续调用这些函数(在应用程序内
当我在android截击请求的OneErrorRepsonse中收到错误时,我想重试该请求。我怎样才能做到这一点?