【问题标题】:AsyncHttpRequest POST not triggering callbacks (android-async-http by loopj)AsyncHttpRequest POST 未触发回调(loopj 的 android-async-http)
【发布时间】:2013-07-04 15:26:12
【问题描述】:

我正在尝试使用 loopj 的 async http library 向服务器发送 POST。以下代码非常标准,但我无法让它工作。

我已经调试了很多,并检查了以下内容:

  • 网址正确。
  • params 是正确的,它们被正确地存储到 params 变量中。

似乎在AsyncHttpRequest.makeRequest() 中调用HttpResponse response = client.execute(request, context); 时,请求不包含任何参数:

编辑:再查看代码后,似乎 POST 参数可能包含在实体或标头组中。

但真正的问题是我没有收到任何回调(请参阅下面的代码)。 client.execute() 调用之后的 if 语句永远不会被调用(不会触发断点)。

RequestParams params = new RequestParams();
params.put("loginid", "user");
params.put("password", "pass");
params.put("deviceid", "deviceid");

AsyncHttpClient client = new AsyncHttpClient();
client.post(MDSettings.BASE_URL + "/user/login", params, new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        Log.d(MDSettings.TAG, "MDConnectionManager - login - response: " + response);
        singleton.connectionSuccessful(response, returnIndex);
    }

    @Override
    public void onFailure(Throwable error, String content) {
        Log.d(MDSettings.TAG, "MDConnectionManager - login - content: " + content);
        singleton.connectionFailed("Login Failed", error.getMessage(), returnIndex);
    }
});

我使用这个库是因为它可以让我将稍后需要的文件发送到这个项目中。如果有另一个库可以做同样的事情(并且确实有效),那对我来说没问题。

我的问题是:为什么我没有收到任何回调,我该如何解决这个问题?当有不清楚的地方告诉我,我会尝试更深入地解释。

【问题讨论】:

  • 是否可以讨论有关此用户/登录文件的一些内容??
  • 你想知道什么?我认为您不需要看到任何其他内容,因为我没有看到 Log.d() 消息,这意味着没有调用 onSuccess()onFailure() 回调。
  • 只是因为参数无效而没有生成json响应所以我问你。再次使用您的服务代码 :)
  • 没有 JSON,全是 XML,但我不要求任何类型的解析 JSON。我正在寻找纯文本。

标签: android post asynchronous loopj


【解决方案1】:

我的android.permission.INTERNET 条目似乎已从清单文件中删除。再次添加后,一切都按预期工作。每次出现问题时,我都会检查我的权限。

【讨论】:

  • 谢谢,一年后我才回到Android,忘记了这个权限:)
【解决方案2】:

试试这个简单的 sn-p。

这适用于我的设备。

它打印“失败”,因为不允许 POST(HTTP 状态:405)

AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("q", "google");

client.post("http://google.com", params, new AsyncHttpResponseHandler(){
     public void onSuccess(String arg0) {
         Log.d("TAG", "Success");        
     };                                      

     public void onFailure(Throwable arg0, String arg1) {
         Log.d("TAG", "Failure");        
     }; 
}); 

【讨论】:

  • 我已经尝试过这段代码,但它什么也没做(就像我自己的代码一样)。好像我无法连接到互联网。
  • 我为赏金选择了这个答案,因为它帮助我找到了问题(由于删除了权限条目,没有互联网连接)。
【解决方案3】:

好吧,我对这个库一无所知,但为什么不尝试使用 AsyncTasks 制作类似的东西呢?例如,您可以继承 AsyncTask 并为其提供要加载的 URL。另一种方法是继承 AsyncTask 并为其提供一个 Callable 对象。这种方法将允许您概括此类,使其适合执行不同的长时间任务,而不仅仅是网络请求。这两种方法都可以利用一些带有回调的接口(onSuccess,onFailure)。而在onPostExecuteMethod中可以判断任务执行是否出错,并提供需要回调。

【讨论】:

  • 如果我只需要做一个普通的 POST 我会完全按照你说的做,但是在项目的后期我还需要发送(相当大的)文件。如果可能的话,我想使用一个库。
【解决方案4】:

在您的代码中,您可以直接从 post 方法调用 responsehander。 第一:

 client.post(MDSettings.BASE_URL + "/user/login", params, responseHandler);

在下一行添加get方法

 client.get(MDSettings.BASE_URL + "/user/login", new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(String response) {
            System.out.println(response);
        }
    });

然后你会得到它的回应

【讨论】:

  • 我需要从 POST 中获取响应,而不是从 GET 中获取响应(这会给我一个错误 XML)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
相关资源
最近更新 更多