从Android中的Async类调用Async类不起作用?

时间:2018-07-22 21:19:24

标签: android json asynchronous android-asynctask

所以我的目标是加载一个随机的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);
    }
}

1 个答案:

答案 0 :(得分:0)

默认情况下,所有异步任务都在同一线程上运行。因此,直到您完成任务后,它才真正开始第二项任务。您的选择是:

1)调用executeOnExecutor而不是execute并告诉它使用新线程。

2)构建代码,以便您可以直接在此线程上发出请求。您已经在使用线程了,没有理由启动一个新线程。

3)编写代码,例如无需调用.get()。