在异步任务中获取调用片段
Getting the calling fragment within an asynchronous task
瞄准
在片段中,我有一个搜索栏,用于查找有关用户键入内容的在线新闻。我想在 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();
}
}
}
如果我是对的,你想更新来电者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();
其实我对你的问题还是很不清楚。如果您有更多疑问,请在评论中告诉我。
必须结帐
瞄准
在片段中,我有一个搜索栏,用于查找有关用户键入内容的在线新闻。我想在 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();
}
}
}
如果我是对的,你想更新来电者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();
其实我对你的问题还是很不清楚。如果您有更多疑问,请在评论中告诉我。
必须结帐