我目前正在处理一个android项目,遇到这种情况,我必须将一个函数作为参数传递,因此我浏览了StackOverflow并尝试了解决方案,以用Runnable
封装了该函数。
我现在面临的问题是,我要传递的函数需要参数,而Runnable.run()
却不接受。因此,我目前正在尝试扩展Runnable
并覆盖run()
以使其接受参数,然后可以将其传递给实际函数。
现在我不太确定,因为run()
中使用了Thread
来说明如何覆盖它,而不用剔除Thread
。到目前为止,我没有使用任何其他Thread
方法。有什么建议的方法吗?
编辑
目标是像这样在侦听器方法中调用这些自定义Runnable:
public void startRequest(RequestOperation operation, final Runnable onSuccess, final Runnable onError, final Runnable onFinished) {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, instance_context.getResources().getString(R.string.base_url), null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
onSuccess.run();
onFinished.run();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
onError.run();
onFinished.run();
}
});
queue.add(request);
}
在最佳情况下,onSuccess
可以传递response
对象,而onError
则可以传递error
。
答案 0 :(得分:2)
为什么要强迫Runnable
成为其设计目标?
只需拥有自己的接口即可,该接口具有所需的签名。
例如
public interface Callback<T> {
void run(T parameter);
}
public void startRequest(RequestOperation operation, final Callback<JSONObject> onSuccess, final Callback<VolleyError> onError, final Runnable onFinished) {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, instance_context.getResources().getString(R.string.base_url), null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
onSuccess.run(response);
onFinished.run();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
onError.run(error);
onFinished.run();
}
});
queue.add(request);
}
或更妙的是(如果您问我):
public interface Callback {
void onSucces(JSONObject response);
void onError(VolleyError error);
void onFinished();
}
public void startRequest(RequestOperation operation, final Callback callback) {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, instance_context.getResources().getString(R.string.base_url), null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
callback.onSuccess(response);
callback.onFinished();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
callback.onFinished();
}
});
queue.add(request);
}
如果需要,您还可以再次将Callback
设为通用
public interface Callback<R, E> {
void onSucces(R response);
void onError(E error);
void onFinished();
}
public void startRequest(RequestOperation operation, final Callback<JSONObject, VolleyError> callback) {...}
要使用:
public class SimpleCallback implements Callback {
public void onSucces(JSONObject response) {
doSomethingWithResponse(response);
}
public void onError(VolleyError error) {
doSomethingWithError(error);
}
void onFinished() {
logFinishTime();
}
}
startRequest(operation, new SimpleCallback());