如何在我的应用程序中正确实现Android-Async-Http库?

时间:2014-08-16 22:09:35

标签: android android-service android-broadcast android-networking android-async-http

我正在寻找有关如何最好地实现此处的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在上面引用的文字中给我的点。

  • 使用服务
  • 广播意图或使用ServiceConnection将中继响应重新发送回Activty

我想了解更多有关这两个建议的信息。

我喜欢使用服务来创建网络请求的想法,这样它将实际网络请求的实现与所有活动和片段分开,并且我能够进行可能的处理,例如解析JSON,错误在不同的线程中处理等。因此从UI线程中删除负载是好的。但是我对我所读到的服务有一些担忧,那就是:

  1. 如果需要清理资源,Android可以随时关闭/终止服务。如果发生这种情况,我的应用程或者android不会关闭当前正在运行的应用程序使用的服务吗?

  2. 我是否将库HttpCLient的静态实例放入服务中?我该如何做呢?

  3. 活动是否会联系我的“NetworkignService”,并告诉它我要向X url发出请求并向其传递所需的参数。然后该服务将发出网络请求,等待响应,然后处理该响应。这是一个错误或成功的回应。那么我是否会在我的Activity中定义一个公共方法,该服务将调用该方法,并根据需要为其提供响应数据?那么我在UI上需要做的就是显示数据吗?

    我希望实现以下目标:

    • 集中代码/访问库的实现。
    • 网络请求的集中错误处理
    • 从UI线程中删除尽可能多的负载
    • 使其成为动态和可扩展的,以便我可以在多个项目中重用网络服务器/实现。
    • 能够在我的应用程序中从活动,片段或其他服务/类中发出Http请求。

    我可以就建议的解决方案征求您的意见和建议,并可能提出更好的解决方案吗?基本上我正在寻找的是一个好的设计模式/原则,我可以从我的Activity和Fragments中发出网络请求。

0 个答案:

没有答案