我正在编写一个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服务获取值并异步返回这些值。 [注意]我正在为一些团队成员写这个,所以他们可以使用它从服务中获取数据,所以我希望它很容易让他们使用。
答案 0 :(得分:1)
使用AsyncTask
或IntentService
。在UI线程上进行网络(通常是冗长的操作)在Android上是禁忌。
您来自AsyncTask fundamentals和tutorials 在这里,你得到了IntentService fundamentals和tutorials
我自己使用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作为“演示者”(智能“视图”)并将所有控制器和模型内容放入背景