Как правильно делегировать JsonObjectRequests из абстрактного класса Android обработчику - PullRequest
0 голосов
/ 13 марта 2019

В настоящее время я работаю над проектом Android, в котором я использую Volley для обработки некоторых запросов JsonObjectRequests.

Все запрашивающие компоненты хранятся в классе абстрактных фрагментов, так что все унаследованные от него фрагменты могут отправлять запросы в мой API и обрабатывать ответ настраиваемым способом.

Общий класс:

public abstract class RequestingFragment extends Fragment implements RequestCallbacks {

    public RequestQueue requestQueue;

    public final void startRequest(final RequestOperation operation) {

        String url = getContext() != null ? getContext().getResources().getString(R.string.base_url) : "";

        final JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, baseUrl + operation.url(requestParams), null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                onSuccess(response, operation.parsingKey());
                onFinished(operation.parsingKey());
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                onError(operation.parsingKey());
                onFinished(operation.parsingKey());
                error.printStackTrace();
            }
        });
        requestQueue.add(request);
    }

    //these are intended to be defined in the subclasses
    public void onSuccess(JSONObject json, String parsingKey) {

    }

    public void onError(String parsingKey) {

    }

    public void onFinished(String parsingKey) {

    }

}

Теперь во время дальнейшей разработки я столкнулся с проблемой, что не только фрагменты должны иметь возможность отправлять запросы, но также и компоненты, такие как RecyclerView.Adapter или BroadcastReceiver. Поэтому я планировал перенести функциональность запроса в обработчик-одиночку, следуя этому описанию.

Как и в приведенном выше фрагменте кода, вы можете видеть, что эти обратные вызовы принимают параметры из ответа на запрос, поэтому мне интересно, если это лучший подход, просто вернуть результат запроса (который может быть различными объектами, такими как JSONObject или VollerError) или передать обратный вызов в startRequest() как Runnable, как написано в здесь .

EDIT

Я опробовал второй подход, и startRequest RequestHandler теперь выглядит так:

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);
}

Теперь мой вопрос: я прочитал, что Runnable выполняется в собственном потоке по умолчанию. В документах Volley говорится, что ответ RequestQueue доставляется в основной поток. Теперь некоторые из моих ответов используются для обновления моего пользовательского интерфейса, так что, если я сделаю это внутри обратных вызовов, разве это не асинхронно? Нужно ли перезагружать свой интерфейс в конце обратного вызова?

РЕДАКТИРОВАТЬ 2

Я пытаюсь создать подкласс Runnable, чтобы передать параметры в метод run(). Затем я попробую проверить, как выполняется обновление пользовательского интерфейса.

...