[英]Accessing data from Restful web service asynchronously
我正在编写一个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服务获取值并异步返回这些值。 [注意]我正在为某些团队成员编写此文件,以便他们可以使用它来从服务中获取数据,因此我希望它可以轻松使用。
使用AsyncTask
或IntentService
。 在Android上,在UI线程上进行联网(通常需要很长时间)。
在这里,您获得了AsyncTask基础知识和一些教程,并且在这里获得了IntentService基础知识和教程。
我本人会使用AsyncTask(IntentService的作业已排队),但请注意在较新的API中处理方式的更改 。 不过没什么大不了的(仅几行代码)
我建议尝试一下David Chandler的Android 基本HTTP客户端库。
最好的方法是使用IntentService。 这样就为您提供了后台线程,并为您传递了URL。 根据您拥有的数据量,您可以将其转储到本地文件中或将其存储在数据库中。
如果执行数据库路由,则可以使用AsyncTaskLoader在活动中异步加载数据,或者使用AsyncTask进行完全访问。 并且,通过一些额外的开销和更简单的编码,您可以将数据粘贴到ContentProvider中,然后在Activity中使用CursorLoader。
最重要的是,永远不要在UI线程上执行网络操作或数据库操作。 将您的“活动”用作“演示者”(智能“视图”),并将所有控制器和模型内容置于后台。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.