Android异步消费Web服务

问题描述:

我需要一个从C#转换到Java/Android的小手,以便客户端使用Web服务异步,因此它不会锁定GUI ...(进度条会是锦上添花。)在C#中,我将创建对象在客户端中执行类似操作。Android异步消费Web服务

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

现在也许是我过于简单,但我认为在Java中这将是非常接近这个方法。我所看到的很多人都说扩展AsyncTask类。我所缺少的是我如何从客户端传递我的价值观?例如,我如何发送用户名和密码?恐怕所有不同的文章和细节都让我感到困惑。我只需要一个简单的方法来完成工作。

所以我对任何提示,指针,教程或其他类似的阅读感谢。

JB

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(); 

6个月回来,我就开始Android开发C#中的背景/。NET

第一选项,我们目前使用的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中的onExExecute和onPostExecute方法。检查文档。

第二个替代是使用loopj library这是一个基于Apache的HttpClient库构建的基于异步回调的Http客户端。

的示例代码利用循环J是

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的,因此,我建议你去一个开放源码库,如循环J这将真正帮助你快速爬上最初的步骤。唯一的挑战是,当你来自另一个平台时,你可能会面临与其他库最初的挑战,而不是简单的AsyncTask,但如果你有灵活性,这是值得花时间的。

+0

BTW,我们使用的是Apache HTTP客户端库 – Adil

+0

我想我明白,只是经过PARAMS一切呼叫。假设我有两个发送。用户名和密码。我必须做单独的实体行,它在方法签名中看起来如何?即更多的细节(String .... params)它看起来像什么? – GPGVM

异步任务带来了很多问题,因为它们托管的活动在执行过程中可能会被破坏。

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

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