繁体   English   中英

不兼容的类型错误:操作另一个类的方法的返回值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM