Получение вызывающего фрагмента в асинхронной задаче - PullRequest
0 голосов
/ 01 ноября 2018

Aim

Во фрагменте у меня есть панель поиска, которая ищет онлайн-новости о том, что набрал пользователь. Я хотел бы отобразить эти новости (название + описание + дата публикации + ... и т. Д.) В графическом интерфейсе как вертикальные блоки.

Осуществление

Пояснения

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

В асинхронной задаче я использую этот REST API (благодаря URL-адресу и некоторым необходимым параметрам в качестве ключа авторизации и т. Д.). Когда мое асинхронное задание получает ответ, оно должно обновить графический интерфейс фрагмента (, т. Е. оно должно вертикально складывать блоки графического интерфейса пользователя, содержащие заголовки, описания и т. Д. Полученных новостей).

Источники

Вы найдете источники в последней части этого вопроса.

Мой вопрос

В асинхронной задаче (точнее: в ее функции, которая выполняется после получения ответа), я не знаю, как получить вызывающий фрагмент. Как это сделать?

Источники

Фрагмент части

private void getAndDisplayNewsForThisKeywords(CharSequence keywords) {
    keywords = Normalizer.normalize(keywords, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "");
    new NetworkUseWorldNews().execute("https://api.currentsapi.services/v1/search?keyword=" + keywords + "&language=en&country=US");
}

Асинхронная часть задачи

    public class NetworkUseWorldNews extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String[] urls) {
            StringBuilder string_builder = new StringBuilder();

            try {
                URL url = new URL(urls[0]);
                HttpsURLConnection https_url_connection = (HttpsURLConnection) url.openConnection();
                https_url

_connection.setRequestMethod("GET");
            https_url_connection.setDoOutput(false);
            https_url_connection.setUseCaches(false);
            https_url_connection.addRequestProperty("Authorization", "XXX");

            InputStream input_stream = https_url_connection.getInputStream();
            BufferedReader buffered_reader = new BufferedReader(new InputStreamReader(input_stream));
            String line;
            while((line = buffered_reader.readLine()) != null) {
                string_builder.append(line);
            }
            buffered_reader.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

        return string_builder.toString();
    }

    @Override
    protected void onPostExecute(String result) {
        try {
            JSONObject news_response_http_call = new JSONObject(result);

            switch(news_response_http_call.getString("status")) {
                case "ok":
                    JSONArray news = news_response_http_call.getJSONArray("news");
                    for(int i = 0; i < news.length(); i++) {
                        JSONObject a_news = news.getJSONObject(i);
                        String title = a_news.getString("title");
                        String description = a_news.getString("description");
                        String date_of_publication = a_news.getString("published");
                        String url = a_news.getString("url");
                        String image = a_news.getString("image");
                        System.out.println(title + ": " + date_of_publication + "\n" + image + "\n" + url + "\n" + description);

                        WorldNewsFragment world_news_fragment = ...;
                    }
                    break;
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

1 Ответ

0 голосов
/ 01 ноября 2018

Если я прав, вы хотите обновить Просмотр вашего абонента Fragment. если FragmentA вызвал сервис, то FragmentA должен быть обновлен.

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

Так что теперь вам нужно будет передать обратный вызов в AsyncTask. Таким образом, вместо публикации полного кода, здесь уже есть ответы с этой проблемой.

Наконец, ваш синтаксис вызова будет выглядеть так.

NetworkUseWorldNews task = new NetworkUseWorldNews(new OnResponseListener() {
    @Override
    public void onResponse(String result) {
        // Either get raw response, or get response model 
    }
});

task.execute();

На самом деле, я все еще не совсем понимаю ваш вопрос. Дайте мне знать в комментариях, если у вас есть еще вопросы.

Должен оформить заказ

...