0

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

4

3 回答 3

1

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

这里有AsyncTask 基础知识和一些教程 这里有IntentService 基础知识教程

我自己会使用 AsyncTask(IntentService 的作业已排队),但要注意在较新的 API 中处理它的方式发生了变化。不过没什么大不了的(只是多几行代码)

于 2012-10-26T23:19:23.360 回答
1

我建议尝试一下 David Chandler 的Android基本 HTTP 客户端库。

于 2012-10-26T23:21:34.137 回答
1

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

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

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

于 2012-10-26T23:23:38.847 回答