我使用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
变量未初始化。但我无法弄清楚如何做到这一点。
有什么建议吗?
答案 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
中的onResume
和removeListener
中的onPause
,以避免内存泄漏。