异步访问Restful Web服务中的数据

时间:2012-10-26 23:17:49

标签: 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");

    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服务获取值并异步返回这些值。 [注意]我正在为一些团队成员写这个,所以他们可以使用它从服务中获取数据,所以我希望它很容易让他们使用。

3 个答案:

答案 0 :(得分:1)

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

您来自AsyncTask fundamentalstutorials 在这里,你得到了IntentService fundamentalstutorials

我自己使用AsyncTask(IntentService的作业排队),但是aware about change in the way it is handled in newer APIs。虽然

,但没什么大不了的(只需要几行代码)

答案 1 :(得分:1)

我建议尝试为David Chandler的basic HTTP client库提供Android版本。

答案 2 :(得分:1)

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

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

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