【问题标题】:Getting the calling fragment within an asynchronous task在异步任务中获取调用片段
【发布时间】:2018-11-01 10:33:27
【问题描述】:

目标

在一个片段中,我有一个搜索栏,用于查找有关用户键入内容的在线新闻。我想在 GUI 中将这些新闻(标题 + 描述 + 出版日期 + ... 等)显示为垂直块。

实施

说明

在片段中,在搜索事件处理中,我实例化了一个异步任务,并使用我用来进行搜索的良好 URL REST API 执行它。

在异步任务中,我使用了这个 REST API(感谢 URL 和一些必需的参数作为授权密钥等)。当我的异步任务得到应答时,它必须更新片段的 GUI(即:它必须垂直堆叠包含所获新闻的标题、描述等的 GUI 块)。

来源

你会在这个问题的最后部分找到来源。

我的问题

在异步任务中(更准确地说:在得到答案后执行的函数中),我不知道如何获取调用片段。如何做到这一点?

来源

片段部分

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

【问题讨论】:

  • 要获取当前片段吗?
  • 我想获取执行异步任务的片段。我不知道“当前”是什么意思:你的定义和我的一样吗?或者它的意思是“Android当前在用户手机上执行的片段”?后者可能会改变,因为(网络!)任务是异步的:想象用户在另一个片段中执行异步任务后 5 秒更改片段(此任务在 > 5 秒后结束):应该执行这个,但是当前的片段会,这对我来说是个问题!

标签: android rest android-fragments android-asynctask androidhttpclient


【解决方案1】:

如果我是对的,您想更新您的呼叫者 Fragment 的视图。如果FragmentA 调用了服务,那么FragmentA 应该被更新。

但是你问的方法是错误的。而不是在 AsyncTask 响应中获取调用者片段。你应该用Callback 来做。

所以现在你需要在 AsyncTask 中传递回调。因此,这里没有发布完整代码,而是 answers 有这个问题。

最后你的调用语法会是这样的。

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

task.execute();

其实我还是很不清楚你的问题。如果您有更多疑问,请在 cmets 中告诉我。

必须结帐

【讨论】:

  • 确实!在这个问题之后,我想问另一个问题,以便将我的数据(异步任务)与我的视图(我的片段的类)分开。因此,我非常高兴地阅读了您的回答,因为您预料到了我的下一个问题!谢谢!
  • 不,你完全理解并完美回答。
  • 也检查链接库。
  • 是的,您有什么问题吗?您是否浏览了我链接的答案。我没有发布要在您的代码中进行的所有更改,因此请检查链接的答案。您将在 AsyncTask 类中创建构造函数。
  • 兄弟,哦,你是新人!,你能通过我链接的答案吗?您将创建回调接口,它还没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多