Как правильно переопределить Runnable.run (), чтобы он мог принимать параметры? - PullRequest
0 голосов
/ 13 марта 2019

Я сейчас работаю над проектом Android и столкнулся с ситуацией, когда мне нужно передать функцию в качестве параметра, поэтому я просмотрел StackOverflow и опробовал решение, чтобы инкапсулировать функцию с Runnable.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что функция, которую я хочу передать, ожидает параметры, а Runnable.run() не принимает их. Поэтому в настоящее время я пытаюсь расширить Runnable и переопределить run(), чтобы позволить ему принимать параметры, которые затем я могу передать действительной функции.

Теперь я немного не уверен, поскольку run() используется в Thread о том, как я могу переопределить его, не выбивая Thread. Пока я не использую другие методы Thread. Любой предложенный подход?

EDIT

Цель состоит в том, чтобы вызвать эти пользовательские Runnables внутри метода слушателя следующим образом:

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.

1 Ответ

2 голосов
/ 13 марта 2019

Зачем заставлять 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...