Android Async消费Web服务

时间:2012-12-30 13:19:39

标签: android web-services android-asynctask

我需要一点手握住从C#转换到Java / Android,以便客户端使用Web服务同步,因此它不会锁定gui ....(进度条会锦上添花。 )在C#中,我会在客户端创建对象做这样的事情。

创建服务参考。 创建一个与服务接口成员匹配的对象并填充。 在单独的线程中启动在第二步中创建的服务请求传递对象。 等待显示进度条。 处理错误或返回数据的响应。

现在也许我太简单了,但我认为在Java中它会非常接近这种方法。我所看到的是很多人说要扩展AsyncTask类。我缺少的是我如何从客户传递我的价值观?例如,如何发送用户名和密码?我担心所有不同的文章和细微差别让我感到困惑。我只需要一种直接的方式来完成工作。

所以我会感激任何提示,指针,教程或其他此类阅读。

JB

3 个答案:

答案 0 :(得分:1)

异步任务带来了很多问题,因为它们托管的活动可能会在执行仍在进行时被销毁。

最好的方法是在intentservice或服务内部托管请求,该请求将在请求活动中生效。

如果您想要一个开箱即用的解决方案,我建议您查看robospice库,这是一个非常成熟的项目。它基于此Google Io 2010 talk

答案 1 :(得分:1)

public class AsyncHttpRequestManager extends AsyncTask<String, Boolean, String> {
    private final String serviceUrl = "URL HERE";
    String user;  
    String pass;

    public AsyncHttpRequestManager(String user, String Pass){
        this.user = user;  
        this.pass = pass;
    }

    @Override
    protected String doInBackground(String... params) {
        //execute the post
        return "";
    }

    protected void onPostExecute(String result) {
        Log.d("MESSAGE", result);
        //update the UI with the results
    }
}

然后使用

执行调用
new AsyncHttpRequestManager(user, pass).execute();

答案 2 :(得分:0)

6个月前,我开始使用C#/ .NET的背景进行Android开发

我们当前使用的第一个选项AsyncTask来执行异步任务...在这种情况下正在使用Web服务......

示例代码是

public class AsyncHttpRequestManager extends AsyncTask<String, Boolean, String> {
    private final String serviceUrl = "URL HERE";

    @Override
    protected String doInBackground(String... params) {
        try {
        DefaultHttpClient client = new DefaultHttpClient();
        HttpPut putRequest = new HttpPut(serviceUrl);
        putRequest.setHeader("Content-type", "text/plain");
        putRequest.setHeader("Accept", "text/plain");
            putRequest.setEntity(new StringEntity(params[0]));
            HttpResponse response = client.execute(putRequest);
            InputStream content = response.getEntity().getContent();
        BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
        String result = "";
        String s = "";
        while ((s = buffer.readLine()) != null) {
            result += s;
        }
        return result;

        } 
        catch (UnsupportedEncodingException e) {
            Log.e("AsyncOperationFailed", e.getMessage());
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            Log.e("AsyncOperationFailed", e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("AsyncOperationFailed", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(String result) {
        Log.d("MESSAGE", result);
    }
}

我已经写了blog post

进一步显示进度/加载对话框,您可能必须覆盖AsyncTask中的onPreExecute和onPostExecute方法。查看文档。

第二个备用是使用loopj library,它是基于Apache的HttpClient库构建的基于异步回调的Android Http客户端。

利用loopj的示例代码是

AsyncHttpClient client = new AsyncHttpClient();
client.setBasicAuth("username","password/token");
client.get("http://www.example.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
    }
});

随着时间的推移,我们已经在HttpClient上创建了帮助器,因此我建议您选择一个开源库,例如loopj,它可以帮助您快速完成初始步骤。唯一的挑战是当你来自另一个平台时,你可能会遇到其他库的初步挑战,而不是简单的AsyncTask,但是如果你有灵活性,那就值得花时间。