我正在寻找有关如何最好地实现此处的Android-Async-Http库的设计方法的一些建议:Link
我以前使用过这个库,它对我来说效果很好,不过我已经遇到过一些小问题,我相信可以通过改变实现方式来解决。
我遇到的问题是,如果我发出请求并且当我的活动不再处于活动状态时(由于用户关闭它)而运行异步回调,并且显示错误消息/内容会引发错误它不能实际访问活动,因为它不再可用。但是,这个问题不是这个问题的主要问题,而是因为我试图在异步回调中访问UI。
在寻找我的问题的一些解决方案时,我得到了以下建议:
@Zapnologica你基本上不希望在实现回调时依赖UI / Context存在。 更好的设计是使用Service,它执行返回数据所需的任何操作,然后通知(广播Intent或使用ServiceConnection)侦听器(例如,您的活动/片段实现),如果上下文是广播将无效已经不存在或片段处于不可见/停用状态。
现在这让我想到我正在错误地实现库。目前我有一个HttpClient
的静态实例,然后我从我的活动/片段中调用它。然后我在库的异步调用中执行相应的代码,(因为回调是在调用活动线程上运行的)。以下是一个例子:
Network.Post(getApplicationContext(), URL, RequestParams, new public AsyncHttpResponseHandler {
@Override
public void onStart() {
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
UpdateListviewAdapter(ParseNetworkResponse(response));
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
Toast.makeToast("Error", Toast.LONG).show();
}
}
};
}
现在这种实施已经足够,它可以完成这项工作。然而,我正在开始一个新的应用程序,我想从头开始,尽可能最好地实现库,这样我就不会在下一行中出现问题。我喜欢smarek在上面引用的文字中给我的点。
我想了解更多有关这两个建议的信息。
我喜欢使用服务来创建网络请求的想法,这样它将实际网络请求的实现与所有活动和片段分开,并且我能够进行可能的处理,例如解析JSON,错误在不同的线程中处理等。因此从UI线程中删除负载是好的。但是我对我所读到的服务有一些担忧,那就是:
如果需要清理资源,Android可以随时关闭/终止服务。如果发生这种情况,我的应用程或者android不会关闭当前正在运行的应用程序使用的服务吗?
我是否将库HttpCLient
的静态实例放入服务中?我该如何做呢?
活动是否会联系我的“NetworkignService”,并告诉它我要向X url发出请求并向其传递所需的参数。然后该服务将发出网络请求,等待响应,然后处理该响应。这是一个错误或成功的回应。那么我是否会在我的Activity中定义一个公共方法,该服务将调用该方法,并根据需要为其提供响应数据?那么我在UI上需要做的就是显示数据吗?
我希望实现以下目标:
我可以就建议的解决方案征求您的意见和建议,并可能提出更好的解决方案吗?基本上我正在寻找的是一个好的设计模式/原则,我可以从我的Activity和Fragments中发出网络请求。