Многочлен в API Mathematica с приложением для Android-Облако

#android #android-studio #math #cloud #wolfram-mathematica

#Android #android-studio #математика #облако #wolfram-mathematica

Вопрос:

Я пытаюсь создать приложение для Android, которое получает многочлен в качестве входных данных и возвращает корни этого в результате через соединение с API Mathematica (cloud). Я создал API Mathematica и получил URL-адрес, чтобы создать ссылку в облаке.

API, который я создал, это:

 api3=APIFunction[{"x"->"Polynom"},RootIntervals[{#x},Complexes]amp;,"String"];
CloudDeploy[api3, Permissions->"Public"]
  

Мой код в приложении для Android приведен ниже:

 public class test extends ActionBarActivity implements CloudInterface {

private EditText field;
private ProgressBar bar;
private TextView text;

private String baseURL = "https://www.wolframcloud.com/objects/cc82c3e5-3ac3-4272-aea6-d5d3505e79a9";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    field = (EditText) findViewById(R.id.field);
    bar = (ProgressBar) findViewById(R.id.progressBar);
    text = (TextView) findViewById(R.id.textView);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public void buttonClick(View v) {

    bar.setVisibility(View.VISIBLE);
    text.setText("");

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(field.getWindowToken(), 0);

    Double num = 0.0;
    if(!field.getText().toString().equals(""))
        num = Double.valueOf(field.getText().toString());

    CloudCompute cc = new CloudCompute(this);
    cc.execute(num);
}


@Override
public void onEvaluateCompleted(String result) {

    bar.setVisibility(View.GONE);

    if (result.endsWith("."))
        result = result.substring(0, result.length() - 1);
    Toast.makeText(getApplicationContext(), "result  "   result, Toast.LENGTH_SHORT).show();

    text.setText(result);
}

@Override
public String getBaseURL() {
    return baseURL;
}
  

}

Приложения прекращают свою работу, когда я нажимаю кнопку, чтобы получить результат. Ошибка, которую он показывает, находится в строке

java.lang.Исключение IllegalStateException: не удалось выполнить метод для Android: onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275 )
в android.view.View.performClick(View.java:4658)
в android.view.View$performClick.run(View.java:19461)
в android.os.Handler.handleCallback(Handler.java:733)
в android.os.Handler.DispatchMessage(Handler.java:95)
в android.os.Looper.loop(Looper.java: 146)
в android.app.ActivityThread.main(ActivityThread.java:5694)
на java.lang.reflect.Метод.invokeNative (собственный метод)
на java.lang.reflect.Method.invoke(Method.java:515)
в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
в com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1107)
в dalvik.system.NativeStart.main(роднойМетод) Вызвано: java.lang.reflect.Исключение InvocationTargetException
в java.lang.reflect.Метод.invokeNative (собственный метод)
на java.lang.reflect.Метод.invoke(метод.java: 515)
в android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270 )
в android.view.View.performClick(View.java:4658)
в android.view.View$performClick.run(View.java:19461)
в android.os.Handler.handleCallback(Handler.java:733)
в android.os.Handler.DispatchMessage(Handler.java:95)
в android.os.Looper.loop(Looper.java: 146)
в android.app.ActivityThread.main(ActivityThread.java:5694)
на java.lang.reflect.Метод.invokeNative (собственный метод)
на java.lang.reflect.Method.invoke(Method.java:515)
в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
в com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1107)
в dalvik.system.NativeStart.main(роднойМетод)
, вызванный: java.lang.NumberFormatException: недопустимый двойной: «x ^ 3-7 * x 7»
в java.lang.StringToReal.invalidReal(StringToReal.java:63)
на java.lang.StringToReal.parseDouble(StringToReal.java:269)
на java.lang.Double.parseDouble(Double.java: 295)
на java.lang.Double.valueOf(Double.java:332)
в user.mathlab.Tautotites.ButtonClick(test.java:69)
в java.lang.reflect.Метод.invokeNative (собственный метод)
на java.lang.reflect.Метод.invoke(метод.java: 515)
в android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270 )
в android.view.View.performClick(View.java:4658)
в android.view.View$performClick.run(View.java:19461)
в android.os.Handler.handleCallback(Handler.java:733)
в android.os.Handler.DispatchMessage(Handler.java:95)
в android.os.Looper.loop(Looper.java: 146)
в android.app.ActivityThread.main(ActivityThread.java:5694)
на java.lang.reflect.Метод.invokeNative (собственный метод)
на java.lang.reflect.Method.invoke(Method.java:515)
на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
на com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1107)
в dalvik.system.NativeStart.main(собственный метод)

Как я могу это решить? Я сделал что-то не так с API? Может ли кто-нибудь, пожалуйста, помочь мне?

Комментарии:

1. Можете ли вы добавить полную трассировку стека?

2. @MartinRevert Да, конечно. Я отредактировал свой вопрос. Скажите мне, поможет ли это вам, или мне нужно ввести что-то еще.

3. Caused by: java.lang.NumberFormatException: Invalid double: "x^3-7*x 7" <— Вы пытаетесь получить формулу из EditText как double. В Java нет типа формулы. Если API является веб-сервисом, скорее всего, вы должны отправить строку.

4. @MartinRevert Спасибо за вашу помощь!! Но не могли бы вы дать мне более подробную информацию? Я новичок в приложениях. API представляет собой веб-сервис. Должен ли я отправлять строку в API или проблема в коде приложения?

5. a) Ваша переменная `num’ создается с двойным типом, поэтому она получает только числа двойной точности, а не функции или формулы. Вы могли бы попробовать изменить его на String. б) Я не знаю реализацию API Mathematica, но, вероятно, он может получать текстовую строку, но будьте осторожны с форматом, который получает API, а также вы не отправляете HTTP-запрос после нажатия кнопки. Я рекомендую прочитать о том, как кодировать клиент веб-службы в Android, прежде чем углубляться в более глубокие воды.