0

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

在我的 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;
        }
}

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

小提示:返回 1.0 和 2.0 不是最好的主意,但被扔进去了,因为我不确定如何返回不是双精度的错误,我想调试发生了什么,结果证明它不是无论如何,我不会走那条路,但我把它留在这里。

4

2 回答 2

2

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

于 2013-10-01T14:38:48.257 回答
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);
    }
}

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

于 2013-10-01T17:05:48.703 回答