Java 从Restful web服务异步访问数据

Java 从Restful web服务异步访问数据,java,android,web-services,Java,Android,Web Services,我正在编写一个android应用程序,其中所有数据都是使用web服务公开的。我正在编写一个包装器类来从名为DataManager的服务中获取数据 public class DataManager{ public DataManager (){} public String getValue () { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet ("some url");

我正在编写一个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。我如何重构这个
编码并从webservice获取值,然后异步返回这些值。[注意]我是为一些团队成员写这篇文章的,这样他们可以使用它从服务中获取数据,因此我希望它能够方便他们使用

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

这是你带的和一些 这是你和


我自己也会使用AsyncTask(IntentService的作业是排队的),但最好是这样。虽然使用
AsyncTask
IntentService
,但这没什么大不了的(只是多了几行代码)。在UI线程上进行联网(通常是冗长的操作)在Android上是不行的

这是你带的和一些 这是你和


我自己也会使用AsyncTask(IntentService的作业是排队的),但最好是这样。没什么大不了的(只是多了几行代码),不过我建议试试David Chandler的Android库。

我建议试试David Chandler的Android库。

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

如果执行数据库路由,则可以使用AsyncTaskLoader在活动中异步加载数据,或者使用AsyncTask执行完全访问。而且,通过一些额外的开销,但编码要简单得多,您可以将数据粘贴到ContentProvider中,然后在活动中使用游标加载程序


最重要的是,不要在UI线程上执行网络操作或数据库操作。将您的活动作为“演示者”(智能“视图”)使用,并将所有控制器和模型的内容放在后台。

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

如果执行数据库路由,则可以使用AsyncTaskLoader在活动中异步加载数据,或者使用AsyncTask执行完全访问。而且,通过一些额外的开销,但编码要简单得多,您可以将数据粘贴到ContentProvider中,然后在活动中使用游标加载程序


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

AsyncTask作业也在较新版本中排队,这是一项功能,而不是一个bug。多个并发线程很难正确管理。对于从RESTful web服务下载数据,可能对同时处理的需求不大;很难想象现实生活中需要从同一个IntentService运行多个下载的场景。我回答的最后一段中的链接涉及排队异步任务的回归。诀窍是你可以摆脱它,因为IntentService作业是按设计排队的。我写了几个移动客户端,有很多场景需要同时访问。因此,我使用AsyncTask(当然是通过
executeOnExecutor()
)进行联网,而不是IntentService。AsyncTask作业也在较新版本中排队,这是一项功能,而不是一个bug。多个并发线程很难正确管理。对于从RESTful web服务下载数据,可能对同时处理的需求不大;很难想象现实生活中需要从同一个IntentService运行多个下载的场景。我回答的最后一段中的链接涉及排队异步任务的回归。诀窍是你可以摆脱它,因为IntentService作业是按设计排队的。我写了几个移动客户端,有很多场景需要同时访问。因此,我使用AsyncTask(当然是通过
executeOnExecutor()
)进行网络连接,而不是使用IntentService。如何使用IntentService实现这一点,并与上面实现的效果相同。例如,我希望有人调用datamanager类从webservice获取数据。DataManager将把数据移交给intentService,并在服务获取数据并将其交回DataManager后将结果返回给用户。所以一个调用看起来像DataManager data=newdatamanager();data.getValue。问题是如何让dataManager从intentservice取回数据?(我有点迷路了,请告诉我)我如何通过intentservice获取数据,并与上面实现的效果相同。例如,我希望有人调用datamanager类从webservice获取数据。DataManager将把数据移交给intentService,并在服务获取数据并将其交回DataManager后将结果返回给用户。所以一个调用看起来像DataManager data=newdatamanager();data.getValue。问题是如何让dataManager从intentservice取回数据?(我有点迷路了,请跟我说)