[英]Incompatible types error: Manipulating return value of another class's method
我需要从 class Post
中的方法doInBackground()
在 class MainActivity
中生成JsonObject
。
我实例化了 class Post
,在其中调用了传递参数的方法,并尝试将其分配给JSONObject
类型的变量。
这是 class 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;
}
}
这就是我尝试在 class MainActivity
中检索 object 的方式:
Post post = new Post();
JSONObject object = post.execute(stringurl, text, "en");
我得到的 Java 错误是类型不兼容。 Required is org.json.JSONObject
and found is android.os.AsyncTask <java.lang.String, java.lang.Void, org.json.JSONObject>
.
我应该能够捕获JSONObject
...如何?
您可以在MainActivity
中声明一个方法,一旦它获取JSONObject
就可以从AsyncTask
调用该方法:
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);
}
如果AsyncTask
不是您的Activity
的内部 class ,您可以使用回调(一个简单的接口),如下所示
public interface PostCallback{
void onSuccess(JSONObject data);
void onError(Exception exception);
}
然后让AsyncTask
有一个PostCallback
类型的字段和一个设置器setCallback(PostCallback)
。
在MainActivity
:
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
中:
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.