我正在使用的Android应用中使用Semantics3 API。我只是按照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;
}
...
...
下面是导致错误的Semantics3 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()));
会导致错误,并且由于它是错误而不是异常,所以它不会被Semantics3代码中围绕它的try-catch块捕获,而是被我的异步调用程序类中的try-catch块捕获。奇怪的是,当我单步执行代码,到达那一行并尝试单步执行而不是结束时,Android Studio不会跳至包含相关代码的文件,即使调试器在框架中列出了该代码也是如此。调试器部分。
因此,我正在寻找有关可能导致此问题以及如何解决此问题的建议。如果有所作为,Semantics3提供了一个Maven依赖项来添加,但我将其转换为gradle而不是将其添加到AndroidStudio中。意思是这样
<dependency>
<groupId>com.semantics3</groupId>
<artifactId>Sem3Java</artifactId>
<version>1.2.4</version>
</dependency>
但是我将此添加到了gradle
implementation 'com.semantics3:Sem3Java:1.2.4'
此外,在文档中,它指出Semantics3库的Java版本是JDK7,但是我正在运行8。我不知道这些东西是否可能是该问题的一部分或促成此问题,但是我想我会分享它,以防相关。感谢您提供的任何帮助,在此先感谢。