如何正确覆盖 Runnable.run(),使其可以带参数?
How to properly override Runnable.run(), so it can take parameters?
我目前正在做一个 android 项目并且遇到了这样的情况,我必须传递一个函数作为参数,所以我浏览了 Whosebug 并尝试了解决方案,用 Runnable
。
我现在面临的问题是,我想传递的函数需要参数,而 Runnable.run()
不接受任何参数。所以我目前正在尝试扩展 Runnable
并覆盖 run()
以让它接受参数,然后我可以将这些参数传递给实际函数。
现在我有点不确定,因为在 Thread
中使用了 run()
关于如何覆盖它,而不用敲除 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
.
为什么要强迫 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());
我目前正在做一个 android 项目并且遇到了这样的情况,我必须传递一个函数作为参数,所以我浏览了 Whosebug 并尝试了解决方案,用 Runnable
。
我现在面临的问题是,我想传递的函数需要参数,而 Runnable.run()
不接受任何参数。所以我目前正在尝试扩展 Runnable
并覆盖 run()
以让它接受参数,然后我可以将这些参数传递给实际函数。
现在我有点不确定,因为在 Thread
中使用了 run()
关于如何覆盖它,而不用敲除 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
.
为什么要强迫 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());