2013-07-15 8 views
0

Я строю простой калькулятор, и я хотел проверить свои вычисления с помощью проверенного калькулятора WolframAlpha, но у меня возникли проблемы с согласованностью. Я программирую это, чтобы узнать больше об Android, Java и XML. Большая часть этого кода берется непосредственно из файла WolframAlphaSample.java и упрощается, чтобы возвращать только нужные нам элементы (информацию).WolframAlpha API вызывает исключение в Android, но не консоль

В моей 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 не самая лучшая идея, но была выбрана, потому что я не уверен, как вернуть ошибку, которая не является двойной, и я хотел отладить то, что происходило, в любом случае, это не так, но я оставил его здесь.

+0

Было бы очень полезно разместить частичную дорожку стека. –

ответ

2

LogCat может быть вашим лучшим другом здесь. он, вероятно, имеет какое-то отношение к времени выполнения android, вызовите задачу Async для обработки запросов HTTP.

1

Try что-то вроде этого

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.