将数据从 Volley onResponse() 传递到接口不起作用

Passing data to an Interface from Volley onResponse() isn't working

我正在使用单个 Volley 库获取多个 API 的数据。为此,我制作了一个通用的 Volley class 并通过传递必需的参数将此 class 形式称为 activity。我成功地做到了这一点。

在此之后,我从服务器获得的响应想要将其传递给一个接口,以便获得与我调用通用 Volley class 相同的 class 结果.但我无法做到这一点。 我知道问题出在我的函数调用中。但是不知道怎么解决。

此外,我正在使用他的技术 第二个答案

Here's my interface

public interface VolleyJsonRespondsListener{

    public  void onSuccessJson(String result, String type);
}

Here's my generic volley class

public class PostVolleyJsonRequest {

    Context context;
    Map<String, String> hashMap=new HashMap<>();
    private VolleyJsonRespondsListener volleyJsonRespondsListener;
    private String networkurl;


    public PostVolleyJsonRequest(Context context, String netnetworkUrl, Map<String, String> hashMap, VolleyJsonRespondsListener volleyJsonRespondsListener) {
        this.hashMap = hashMap;
        this.networkurl = netnetworkUrl;
        this.volleyJsonRespondsListener = volleyJsonRespondsListener;
        this.context=context;
        sendRequest();
    }

    private void sendRequest() {
        StringRequest stringRequest = new StringRequest(Request.Method.POST, networkurl,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.i("result", response);
                        volleyJsonRespondsListener.onSuccessJson(response, "sub"); //here's the error

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.d("result", "error " + error);
                        error.printStackTrace();
                                         }
                }) {
            @Override
            protected Map<String, String> getParams() {
                return hashMap;
            }
        };

        RequestQueue requestQueue = Volley.newRequestQueue(context);
        /*handle timeout error*/
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                10000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        requestQueue.add(stringRequest);
    }
}

Here's my activity from which am calling function and want to get server response through interface

public class Login extends AppCompatActivity implements VolleyJsonRespondsListener {

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

  new PostVolleyJsonRequest(context, CommonObjects.API_LOGIN, hashMap, ); //here to do something

    }

 @Override
    public void onSuccessJson(String result, String type) {
        Log.i("resultRespone", result);


    }

    @Override
    public void onFailureJson(int responseCode, String responseMessage) {

    }
}

Logcat

2019-07-31 14:35:05.703 9401-9401/com.amcbr.amcbradmin E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.amcbr.amcbradmin, PID: 9401
    java.lang.NullPointerException: Attempt to invoke interface method 'void com.amcbr.amcbradmin.classes.utils.VolleyJsonRespondsListener.onSuccessJson(java.lang.String, java.lang.String)' on a null object reference
        at com.amcbr.amcbradmin.classes.utils.PostVolleyJsonRequest.onResponse(PostVolleyJsonRequest.java:102)
        at com.amcbr.amcbradmin.classes.utils.PostVolleyJsonRequest.onResponse(PostVolleyJsonRequest.java:98)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:78)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:224)
        at android.app.ActivityThread.main(ActivityThread.java:7127)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)

你的 Login Activity 中没有正确传递监听器,应该是这样的:

new PostVolleyJsonRequest(context, CommonObjects.API_LOGIN, hashMap, Login.this);