所以我的目标是加载一个随机的Wikipedia页面,从中获取标题,然后使用Wikipedia api获取正确的标题以返回显示(带有特殊字符的标题需要“翻译”才能显示它们正确。)当我使用JSONRequest类(异步)尝试执行api网址并创建JSON对象时,就会出现我的问题。当它尝试执行时,它冻结并且不再继续(但不会崩溃)。URL没问题,它是有效的,并且可以在台式机和移动设备上使用。此方法还用在另一个非异步类中,因此我知道它可以在其中工作。我的猜测是这是一个异步问题。这可能是一个愚蠢的问题,答案很简单,但是对您的任何帮助,我们将不胜感激!
public class getRandom extends AsyncTask<String, Void, String> {
private static final String REQUEST_METHOD = "GET";
private static final int READ_TIMEOUT = 15000;
private static final int CONNECTION_TIMEOUT = 15000;
String result, rawTitle;
// Gets random wiki page and returns text to be loaded into search bar
@Override
protected String doInBackground(String... params){
String randomUrl = "https://en.wikipedia.org/wiki/Special:Random";
String titleApiUrl = "https://en.wikipedia.org/w/api.php?action=query&format=json&titles=";
// Get random title
try {
URL url = new URL(randomUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//Set method and timeouts
con.setRequestMethod(REQUEST_METHOD);
con.setReadTimeout(READ_TIMEOUT);
con.setConnectTimeout(CONNECTION_TIMEOUT);
// Get status
int status = con.getResponseCode();
// Check for move or redirect and update url
if (status == HttpURLConnection.HTTP_MOVED_TEMP
|| status == HttpURLConnection.HTTP_MOVED_PERM) {
String location = con.getHeaderField("Location");
URL newUrl = new URL(location);
con = (HttpURLConnection) newUrl.openConnection();
}
// Get name of page
rawTitle = con.toString();
int temp = rawTitle.indexOf("wiki/") + 5;
rawTitle = rawTitle.substring(temp);
con.disconnect();
}
catch(IOException e){
e.printStackTrace();
rawTitle = "Sailboats"; // Very random, totally not hard coded result.
}
// Ensure correct title format (use wiki api)
try{
// Get json from api
JSONRequest wikiRequest = new JSONRequest();
String wikiApiJsonString = wikiRequest.execute(titleApiUrl + rawTitle).get();
// Create json object with returned string
JSONObject jsonObj = new JSONObject(wikiApiJsonString);
// Get correct title from json
result = jsonObj.getString("title");
}
catch(ExecutionException | InterruptedException | JSONException e){
e.printStackTrace();
result = "Sailboats"; // Very random, totally not hard coded result.
}
return result;
}
protected void onPostExecute(String result){
super.onPostExecute(result);
}
}
答案 0 :(得分:0)
默认情况下,所有异步任务都在同一线程上运行。因此,直到您完成任务后,它才真正开始第二项任务。您的选择是:
1)调用executeOnExecutor而不是execute并告诉它使用新线程。
2)构建代码,以便您可以直接在此线程上发出请求。您已经在使用线程了,没有理由启动一个新线程。
3)编写代码,例如无需调用.get()。