Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不兼容类型错误:操作另一个类的返回值';s法_Java_Android_Class_Methods - Fatal编程技术网

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
的字段和setter
setCallback(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)
。由于我没有看到您的代码,我无法判断构造函数(属于哪个类?)可能有什么问题,因此没有任何建议,抱歉。