【问题标题】:Passing data to an Interface from Volley onResponse() isn't working从 Volley onResponse() 向接口传递数据不起作用
【发布时间】:2019-07-31 09:37:05
【问题描述】:

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

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

另外,我正在使用他的技术Handle Multiple request in Android volley 第二个答案

这是我的界面

public interface VolleyJsonRespondsListener{

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

这是我的通用排球课

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);
    }
}

这是我正在调用函数并希望通过接口获取服务器响应的活动

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$1.onResponse(PostVolleyJsonRequest.java:102)
        at com.amcbr.amcbradmin.classes.utils.PostVolleyJsonRequest$1.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)

【问题讨论】:

    标签: android interface android-volley


    【解决方案1】:

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

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

    【讨论】:

    • 我不能通过 thisas 参数。由于函数调用的数据类型不同,在接收端为volleyJsonRespondsListener: com...utils.VolleyJsonRespondsListener this  (anonymous...view.View.OnClickListener)
    • 在你的登录类中传递它,如果你在点击监听器中发出这个请求,试着写Login.this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多