Я использую Semantics3 API в приложении для Android, над которым я работаю.Я просто делаю очень простой запрос, следуя базовому примеру, представленному в документации Semantics3.Проблема заключается в том, что при поиске продукта происходит сбой приложения.Поэтому я установил несколько точек останова и обнаружил ошибку «NoSuchMethod». В частности, это говорит об этом:
java.lang.NoSuchMethodError: No direct method <init>(Ljava/io/InputStream;)V in class Lorg/json/JSONTokener; or its super classes (declaration of 'org.json.JSONTokener' appears in /system/framework/core-libart.jar)
Вот соответствующий бит кода в моей основной деятельности, который инициирует вызов.
private String TAG = "MainActivity";
private EditText searchBox;
private Button searchButton;
private Products products;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
searchBox = findViewById(R.id.searchBox);
searchButton = findViewById(R.id.searchButton);
// Set up a client to talk to the Semantics3 API using API credentials
products = new Products("xxx", "xxx");
searchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String searchText = searchBox.getText().toString();
Log.d(TAG, searchText);
products.productsField("search", searchText);
AsyncCall serviceCall = new AsyncCall();
serviceCall.execute(products);
}
});
}
}
Вот класс AsyncCall. В методе .get () возникает ошибка.
public class AsyncCall extends AsyncTask<Products, Void, JSONObject> {
String TAG = "Async";
@Override
protected JSONObject doInBackground(Products... products){
JSONObject results = null;
Products product = products[0];
try{
results = product.get();
Log.d(TAG, results.toString()) ;
}catch(Throwable e){
Log.d(TAG, e.toString());
Log.d(TAG, e.getStackTrace().toString());
}
return results;
}
...
...
Ниже приведен фрагмент кода из семантики3.API, который вызывает ошибку.
protected JSONObject fetch(String endpoint, String params) throws
OAuthMessageSignerException,
OAuthExpectationFailedException,
OAuthCommunicationException,
IOException, URISyntaxException {
...
...
...
request.connect();
try {
JSONObject json = new JSONObject(new JSONTokener(request.getInputStream()));
if (!json.has("code")){
json.put("code", "OK");
}
return json;
}
catch (IOException e) {
InputStream error = ((HttpURLConnection) request).getErrorStream();
JSONObject json = new JSONObject(new JSONTokener(error));
if (!json.has("code")) {
json.put("code", "Error");
}
else {
Object value = json.get("code");
json.put("code", value.toString());
}
return json;
}
}
Именно эта строка
JSONObject json = new JSONObject(new JSONTokener(request.getInputStream()));
приводит к ошибке, и поскольку это ошибка, а не исключение, она нене пойман блоком try-catch, окружающим его в коде Semantics3, но блоком try-catch в моем классе Async Caller. Странно то, что когда я прохожу код, достигаю эту строку и пытаюсь войти в строкуAndroid Studio не переходит к файлу, который содержит соответствующий код, а не больше, хотя отладчик перечисляет его в разделе кадров отладчика.
Так что я ищуза совет относительно того, чтоЯ буду вызывать эту проблему и как ее решить.Если это имеет значение, Semantics3 дал зависимость Maven для добавления, но вместо этого я преобразовал ее в стандартную, чтобы добавить ее в AndroidStudio.Это означало, что это дало
<dependency>
<groupId>com.semantics3</groupId>
<artifactId>Sem3Java</artifactId>
<version>1.2.4</version>
</dependency>
, но я добавил это в gradle
implementation 'com.semantics3:Sem3Java:1.2.4'
Кроме того, в документации указано, что версия Java для библиотеки Semantics3это JDK7, но я работаю 8. Я не знаю, может ли какая-либо из этих вещей быть частью или способствовать этой проблеме, но я решила поделиться ею, если это уместно.Я ценю любую помощь, которую вы, ребята, можете предложить, заранее спасибо.