#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, прежде чем углубляться в более глубокие воды.