完全丢失试图调用Web服务

时间:2013-01-01 19:00:08

标签: java android android-service

过去几天我问过这个问题的变化。我不理解或建立正确的联系等等,所以我真的很沮丧,不明白我应该走哪条路。

我开发了一个XAMLX WCF工作流服务,我的Windows客户端就可以很好地与它进行交互。我是android和java的新手,因此基本上是一个NOOB。我的服务使用BasicHttpBinding并在请求中需要几个字符串值(uid和pwd)。响应只是一个字符串。

现在在android上我完全迷失了。我已经读过使用AsyncTask,我听说它有重大问题并使用RoboSpice。看看RoboSpice它看起来非常坚固,但学习曲线非常僵硬。我听说过使用LoopJ的僵硬学习曲线,因为它在开始时会更容易。扔在那里希望你使用JSON的人,是的。我绝对迷路了。

所以我被拉到了很多不同的方向。我知道我需要它是Async,所以它不会锁定ui线程,我想得到一个可靠的强大解决方案,但现在只需同步与服务交互的婴儿步骤将是令人鼓舞的。

以下是我的基础知识: 向服务发送请求。 让应用程序暂停/循环等。进度条会很精彩,但是一个不挂起的简单循环现在就可以了。 接收响应并继续处理。

这对我来说在.NET中很简单我认为这很简单。只是表明骄傲在堕落之前到来。

TIA JB


直接问题

正如已经评论过,我的OP中有几个隐含的问题。那是因为我不知道该问什么。那么现在让我们来看看AsynchTask吧。让我们称之为我的宝贝。 这是我的问题: HOW 我是否将值关联以填充请求?在.NET中,我将创建一个与请求所期望的匹配的对象。所以我的对象将具有UserName属性和Password属性。我会给他们分配像obj.UserName =“Joe”这样的值;然后我会调用服务操作并将其传递给obj。

如何我确保使用正确的库吗?我已经读过AsyncTask使用Apache Http Client库。好吧,我谷歌那个拿到罐子,显然它已经结束了。但仍然可用,所以我下载最新的并把它放在我的lib文件夹....但我没有,因为我可以导入org.apache.http.HttpResponse没有它所以我使用哪个版本,我应该使用较旧的或最新的。

**最后我如何让应用程序暂停,因为这段代码做了一些事情(虽然它从未在我的服务机器的日志中显示)并且在执行某些操作时我的代码继续执行并在到达时崩溃它需要来自服务的数据.....但它不存在。进度条就是蜜蜂的膝盖。

以下是我的实施代码:

public class AsyncHttpRequestManager extends AsyncTask<String, Boolean, String>
{
private static final String serviceUrl = "http://www.serviceurl.com/service.xamlx";

@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])); //This one is connected to my first question. How do I get the proper associations for the operations contract.
            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);
}

}

我这样称呼:

new AsyncHttpRequestManager().execute("joe","asdf");

如果需要更多信息,我很乐意发布。

1 个答案:

答案 0 :(得分:0)

你应该一次提出一个问题,这就是SO的设计和策划方式。

用于HTTP身份验证

http://developer.android.com/reference/org/apache/http/auth/UsernamePasswordCredentials.html

E.g。

HttpClient client = new HttpClient();
client.getParams().setAuthenticationPreemptive(true);
Credentials defaultcreds = new UsernamePasswordCredentials("username", "password");
client.getState().setCredentials(new AuthScope("myhost", 80, AuthScope.ANY_REALM), defaultcreds);

Asynctask不需要任何外部库,它是Android平台的一部分。不要对HTTPClient和Asynctask感到困惑。 Asyntask是一个泛型类,用于在主UI线程的单独线程上调用后台处理以避免阻塞。恰好您正在考虑使用Asynctask来处理您的Web请求,但它们没有以任何方式链接。

关于“如何将数据返回到我的应用程序”的问题最好单独提出,但实际上,您是按顺序思考的。您的应用不应暂停。有很多方法,进度对话是一个,以妥善处理这个。