【问题标题】:Android Async Consume Web ServiceAndroid 异步消费网络服务
【发布时间】:2012-12-30 13:19:38
【问题描述】:

我需要一个从 C# 到 Java/Android 的小手,让客户端当然可以异步使用 Web 服务,这样它就不会锁定 gui....(进度条会锦上添花。 ) 在 C# 中,我会创建对象在客户端执行类似的操作。

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

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

因此,我将不胜感激任何提示、指针、教程或其他此类阅读。

JB

【问题讨论】:

    标签: android web-services android-asynctask


    【解决方案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】:

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

      最好的方法是将请求托管在一个意图服务或服务内部,这将在请求活动中继续存在。

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

      【讨论】:

        【解决方案3】:

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

        我们目前使用的

        第一个选项AsyncTask 来执行异步任务...在这种情况下正在消耗网络服务...

        示例代码是

        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,这是一个基于异步回调的 Android Http 客户端,构建在 Apache 的 HttpClient 库之上。

        使用 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 的初始挑战,但如果您有灵活性,那么值得花时间。

        【讨论】:

        • 顺便说一句,我们正在使用 Apache Http 客户端库
        • 我想我什么都懂,除了传递参数。假设我有两个要发送。用户名和密码。我是否必须做单独的实体行,它在方法签名中的外观如何?即有关 (String..params) 的更多详细信息,它是什么样的?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多