Java 不兼容类型错误:操作另一个类的返回值';s法
我需要从类Java 不兼容类型错误:操作另一个类的返回值';s法,java,android,class,methods,Java,Android,Class,Methods,我需要从类Post中的方法doInBackground()在类MainActivity中生成一个JsonObject 我实例化了类Post,调用其中传递参数的方法,并尝试将其分配给类型为JSONObject的变量 这是类Post: class Post extends AsyncTask<String, Void, JSONObject> { @Override protected JSONObject doInBackground(String... args)
Post
中的方法doInBackground()
在类MainActivity
中生成一个JsonObject
我实例化了类Post
,调用其中传递参数的方法,并尝试将其分配给类型为JSONObject
的变量
这是类Post
:
class Post extends AsyncTask<String, Void, JSONObject> {
@Override
protected JSONObject doInBackground(String... args) {
JSONObject jsonObject = null;
try {
//Connect to the website
Connection.Response response =
Jsoup.connect(args[0])
.method(Connection.Method.POST)
.data("text", args[1])
.data("language", args[2])
.ignoreContentType(true)
.execute();
Document document = response.parse();
jsonObject = new JSONObject(document.text());
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException err) {
Log.d("Error", err.toString());
}
return jsonObject;
}
}
private PostCallback callback;
private Exception exception;
public setPostCallback(PostCallback callback){
this.callback = callback;
}
@Override
protected JSONObject doInBackground(String... args){
// keep everything as before but when an Exception occurs,
// assign it to *exception* in the catch block
}
@Override
public void onPostExecute(JSONObject jsonObject){
// Note: this will be executed on the main thread
if(exception == null){
callback.onSuccess(jsonObject);
} else {
callback.onError(exception);
}
}
我得到的Java错误是不兼容的类型。必需的是org.json.JSONObject
,找到的是android.os.AsyncTask
我应该能够捕获
JSONObject
。。。如何执行?您可以在MainActivity
中声明一个方法,该方法可以在AsyncTask
获取JSONObject
后调用:
private onObtainJSONObject(JSONObject jsonObject){
if(jsonObject != null){
// do something with the JSONObject
} else{
// something went wrong - maybe show an error message?
}
}
您需要覆盖AsyncTask
中的onPostExecute()
:
public void onPostExecute(JSONObject jsonObject){
// Note: this will be executed on the main thread
MainActivity.this.onObtainJSONObject(jsonObject);
}
如果异步任务
不是活动的内部类
,则可以使用回调(简单接口),如下所示
public interface PostCallback{
void onSuccess(JSONObject data);
void onError(Exception exception);
}
然后让AsyncTask
具有类型为PostCallback
的字段和settersetCallback(PostCallback)
在main活动中
:
Post post = new Post();
JSONObject object = post.execute(stringurl, text, "en");
Post post = new Post();
post.setPostCallback(new PostCallback(){
@Override
onSuccess((JSONObject data){
onObtainJSONObject(data);
}
@Override
onError(Exception exception){
// exception handling ...
}
});
JSONObject object = post.execute(stringurl, text, "en");
在Post
中:
class Post extends AsyncTask<String, Void, JSONObject> {
@Override
protected JSONObject doInBackground(String... args) {
JSONObject jsonObject = null;
try {
//Connect to the website
Connection.Response response =
Jsoup.connect(args[0])
.method(Connection.Method.POST)
.data("text", args[1])
.data("language", args[2])
.ignoreContentType(true)
.execute();
Document document = response.parse();
jsonObject = new JSONObject(document.text());
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException err) {
Log.d("Error", err.toString());
}
return jsonObject;
}
}
private PostCallback callback;
private Exception exception;
public setPostCallback(PostCallback callback){
this.callback = callback;
}
@Override
protected JSONObject doInBackground(String... args){
// keep everything as before but when an Exception occurs,
// assign it to *exception* in the catch block
}
@Override
public void onPostExecute(JSONObject jsonObject){
// Note: this will be executed on the main thread
if(exception == null){
callback.onSuccess(jsonObject);
} else {
callback.onError(exception);
}
}
该方法不需要返回类型吗?和
MainActivity。此
报告它不是一个封闭类。我不能编写代码来操作主线程中的对象吗?@JouanH.Sulaiman-我假设AsyncTask是MainActivity的一个内部类。如果不是这样,那么您必须使用某种回调,将结果传递回MainActivity。我将编辑我的答案以指示如何执行此操作。(cont)(cont)关于“我不能编写代码来操作主线程中的对象吗?”-通常您不希望为了等待AsyncTask完成其工作而阻塞主线程。这就是使用回调的原因。但是execute()返回AsyncTask实例的原因是有一个方法get(),它会阻止主线程,直到执行完成。很抱歉,这是一个有待我研究的领域。公共接口在MainActivity还是AsyncTask中?代码main活动给出了很多错误,例如,对于后回调,无法解析符号,@Override不适用于构造函数,无法解析onObtainJSONObject的方法。通过添加void
,我确实解决了onSuccess和onError所需的返回类型问题,但其他错误非常严重。顺便说一句,谢谢你@JouanH.Sulaiman-接口可以是独立的,也可以(因为它属于异步任务
)是异步任务
的一部分。有时,当您确实实现了某个东西,但它不是public
时,您会看到“无法解析符号”,因此您所在的类无法“看到”它。关于“无法解析方法”:请确保从我对MainActivity
的回答开始复制了方法onObtainJSONObject(JSONObject)
。由于我没有看到您的代码,我无法判断构造函数(属于哪个类?)可能有什么问题,因此没有任何建议,抱歉。