【问题标题】:Accessing data from Restful web service asynchronously从 Restful Web 服务异步访问数据
【发布时间】:2012-10-26 23:17:48
【问题描述】:

我正在编写一个 android 应用程序,其中我的所有数据都使用 Web 服务公开。我正在编写一个包装类来从名为 DataManager 的服务中获取数据。

public class DataManager{

public DataManager (){}


public String getValue ()
{
    HttpClient client = new DefaultHttpClient();
    HttpGet get = new HttpGet ("some url");

    try 
    {
        HttpResponse response = client.execute(get);
        if (response.getStatusLine ().getStatusCode() == 200)
        {
            HttpEntity entity = response.getEntity ();
            String result = EntityUtils.toString(entity);
            return result;
        }
    } 
    catch (ClientProtocolException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

}

当我调用此方法时,UI 线程上会生成一个 RuntimeException。我该如何重构这个 编码并从 web 服务中获取值并异步返回这些值。 [注意] 我正在为一些团队成员写这篇文章,以便他们可以使用它从服务中获取数据,所以我希望它可以让他们轻松使用。

【问题讨论】:

    标签: java android web-services


    【解决方案1】:

    使用AsyncTaskIntentService。在 UI 线程上进行联网(通常是冗长的操作)在 Android 上是不行的。

    这里有AsyncTask fundamentals 和一些tutorials 在这里你得到了IntentService fundamentalstutorials

    我自己会使用 AsyncTask(IntentService 的作业已排队),但要使用 aware about change in the way it is handled in newer APIs。不过没什么大不了的(只是多了几行代码)

    【讨论】:

    • AsyncTask 作业也在较新的版本中排队,这是一项功能而不是错误。多个并发线程很难正确管理。对于从 RESTful Web 服务下载数据,可能对同时处理的需求并不大;很难想象现实生活中您必须从 same IntentService 运行多个下载的场景。
    • 我的答案最后一段中的链接涉及有关排队异步任务的回归。诀窍是您可以摆脱它,IntentService 作业是按设计排队的。我写了几个移动客户端,并且有很多需要同时访问的场景。因此,我使用 AsyncTask(当然是通过executeOnExecutor())进行网络,而不是 IntentService。
    【解决方案2】:

    我建议试试 David Chandler 的 Android 版 basic HTTP client 库。

    【讨论】:

      【解决方案3】:

      最好的方法是使用 IntentService。这为您提供了一个后台线程和一种向其传递 URL 的方法。根据您拥有的数据量,您可以将其转储到本地文件或存储在数据库中。

      如果您执行数据库路由,您可以使用 AsyncTaskLoader 在 Activity 中异步加载数据,或使用 AsyncTask 进行完全访问。而且,通过一些额外的开销但更简单的编码,您可以将数据粘贴到 ContentProvider 中,然后在您的 Activity 中使用 CursorLoader。

      最重要的是,永远不要在 UI 线程上进行网络操作或数据库操作。 将您的 Activity 用作“演示者”(智能“视图”),并将所有控制器和模型内容放在背景。

      【讨论】:

      • 我怎样才能通过 IntentService 获得它,并且与上面实现的效果相同。例如,我希望有人调用 datamanager 类从 web 服务获取数据。 DataManager 将把它交给 intentService 并在服务获取数据并将其返回给 dataManager 后将结果返回给用户。所以调用看起来像这样 DataManager data = new DataManager ();数据.getValue。问题是如何让dataManager从intentservice中取回数据?(我有点迷路了,所以请和我在一起)
      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2012-09-20
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多