如何正确覆盖 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());