WolframAlpha API在Android中引发异常,但不是控制台

时间:2013-07-15 20:10:05

标签: java android api wolframalpha

我正在构建一个简单的计算器,我想使用经过验证的计算器WolframAlpha验证我的计算,但我遇到了一些一致性问题。我正在编程,以了解有关Android,Java和XML的更多信息。大部分代码都直接来自WolframAlphaSample.java文件,并简化为只返回我们需要的“pods”(信息)。

在我的ActivityMain.java中,我传递了我的editText函数:

Double wolframAnswer = WolframAlpha.queryInput(editLine.getText().toString());

在WolframAlpha.queryInput()中,我的代码如下:

    public static double queryInput(String input)
    {
        WAEngine engine = new WAEngine();
        System.out.println("Wolfram Input: " + input);
        // These properties will be set in all the WAQuery objects created from this WAEngine.
        engine.setAppID(appid);
        engine.addFormat("plaintext");
        engine.addIncludePodID("DecimalApproximation");
        engine.addIncludePodID("Result");
        WAQuery query = engine.createQuery(); // Create the query.
        query.setInput(input); // Sets property of the query.
        double finalResult = 0.0;
        try {
            // This sends the URL to the Wolfram|Alpha server, gets the XML result
            // and parses it into an object hierarchy held by the WAQueryResult object.
            WAQueryResult queryResult = engine.performQuery(query);
            //System.out.println(((WAPlainText)(queryResult.getPods()[0].getSubpods()[0].getContents()[0])).getText());
            String unroundedResult;

            if (queryResult.isError()) 
            {
                return 1.0; // error
            } 
            else if (!queryResult.isSuccess()) 
            {
                return 2.0; // misunderstood
            }
            else if(queryResult.getPods().length == 1)
            { 
                unroundedResult = ((WAPlainText)(queryResult.getPods()[0].getSubpods()[0].getContents()[0])).getText();
                if (unroundedResult.endsWith("...")) // Remove trailing dots if really long number
                {
                    unroundedResult = unroundedResult.replaceAll("\\.\\.\\.", "");
                }
            }
            else
            {
                unroundedResult = ((WAPlainText)(queryResult.getPods()[1].getSubpods()[0].getContents()[0])).getText();
            }
            finalResult = Double.parseDouble(unroundedResult);
        } catch (WAException e) {
            e.printStackTrace();
        }
        return finalResult;
        }
}

当我们使用简单查询(5 + 8)从WolframAlpha.java中的控制台运行它时,它工作正常,如果我们从我们的Android应用程序运行它,它传递完全相同的数据,它会捕获并抛出异常。知道我们为什么会看到两种不同的行为吗?

小注意:返回1.0和2.0并不是最好的想法,但是因为我不确定如何返回不是双倍的错误并且我想调试发生了什么,它结果出来了不管怎么说它没有采取这条路,但我把它留在了这里。

2 个答案:

答案 0 :(得分:2)

LogCat可能是您最好的朋友。它可能与android运行时有关,调用异步任务来处理HTTP请求。

答案 1 :(得分:1)

尝试这样的事情

private class YourTask extends AsyncTask<String, Void, String> {


    protected void onPreExecute() {

    }

    @Override
    protected WAQueryResult doInBackground(String... urls) {

        WAQueryResult queryResult = engine.performQuery(query);

        return queryResult;
    }

    @Override
    protected void onPostExecute(WAQueryResult response) {
         if (queryResult.isError()) 
        {
            return 1.0; // error
        } 
        else if (!queryResult.isSuccess()) 
        {
            return 2.0; // misunderstood
        }
        else if(queryResult.getPods().length == 1)
        { 
            unroundedResult = ((WAPlainText)(queryResult.getPods()[0].getSubpods()[0].getContents()[0])).getText();
            if (unroundedResult.endsWith("...")) // Remove trailing dots if really long number
            {
                unroundedResult = unroundedResult.replaceAll("\\.\\.\\.", "");
            }
        }
        else
        {
            unroundedResult = ((WAPlainText)(queryResult.getPods()[1].getSubpods()[0].getContents()[0])).getText();
        }
        finalResult = Double.parseDouble(unroundedResult);
    }
}

如果这不起作用,请尝试使用Strings而不是WAQueryResult调用方法。