当前位置: 首页 > 知识库问答 >
问题:

Android截击错误D/截击:[486]基本网络。日志任务:

端木宏才
2023-03-14

我正在尝试使用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);
    }
}

共有1个答案

韶浩皛
2023-03-14

你用截击的方式真奇怪。Volley发出异步HTTP请求。这两行代码不会每次都给出结果

 HTTPConnector httpConnector=new HTTPConnector(url,context);
 JSONObject response=httpConnector.getJsonResponse();

您正在发送async...请求并立即调用getJsonContent函数?当您调用该函数时,您不能确定是否有可用的响应。当您得到响应时,您应该返回响应,即在JsonObjectRequestOnSolutions方法中

因此,您应该正确地实现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中收到错误时,我想重试该请求。我怎样才能做到这一点?