将数据从 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);
我正在使用单个 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);