初始化委托变量

时间:2015-08-03 17:22:25

标签: java android asynchronous nullpointerexception delegates

我使用OkHttp库来处理HTTP操作。我创建了一个名为HttpClient的独立Java类,以包含可以重用的所有方法。到目前为止,我只为POST请求实现了该方法。

public class HttpClient {

    private static final OkHttpClient client = new OkHttpClient();

    private static OnHttpRequestComplete listener;

    public static void post(String url, Map<String, String> postData) throws IOException {
        FormEncodingBuilder form = new FormEncodingBuilder();
        for (HashMap.Entry<String, String> entry : postData.entrySet()) {
            form.add(entry.getKey(), entry.getValue());
        }

        RequestBody body = form.build();
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                listener.requestFailed(e);
            }

            @Override
            public void onResponse(Response response) throws IOException {
                if (response.isSuccessful()) {
                    String jsonData = response.body().string();
                    try {
                        JSONObject jsonObj = new JSONObject(jsonData);
                        Log.d("LOG_TAG", "Response: " + jsonObj.toString());
                        listener.requestSuccessful();
                    } catch (JSONException e) {
                        listener.requestFailed(e);
                    }
                }
            }
        });
    }
}

interface OnHttpRequestComplete {
    public void requestSuccessful();
    public void requestFailed(Exception e);
}

既然我要从其他类调用这些方法,我需要一种方法来发回我得到的数据。因为执行是异步完成的,所以我无法简单地返回值。我来自iOS所以我认为这是一个利用委托模式的好地方。

我做了一些研究,发现委托在Java中被称为接口。所以我添加了一个名为OnHttpRequestComplete的接口,其中包含两个方法requestSuccessful()requestFailed(Exception e)。我还在类型为listener的名为OnHttpRequestComplete的HttpClient类的顶部声明了一个变量。

在另一个Activity中,我实现了这两个方法并运行了应用程序。触发http请求并成功获取响应。但是一旦它到达行listener.requestSuccessful();,应用程序就会崩溃并出现NullPointerException。我假设它是因为listener变量未初始化。但我无法弄清楚如何做到这一点。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为您需要一个List<OnHttpRequestComplete> listeners,因为您可能希望能够为您的活动拥有多个订阅者。

private static List<OnHttpRequestComplete> listeners;

public HttpClient() {
    listeners = new ArrayList<>();
}

public void addListener(OnHttpRequestComplete listener) {
    listeners.add(listener);
}

public void removeListener(OnHttpRequestComplete listener) {
    listeners.remove(listener);
}

完成后,您可以通过以下方式调用回调方法:

for (OnHttpRequestComplete listener : listeners) {
    listener.requestSuccessful();
}

在您的活动中,拨打addListener中的onResumeremoveListener中的onPause,以避免内存泄漏。