【问题标题】:Sending http requests to server from background service fails从后台服务向服务器发送 http 请求失败
【发布时间】:2012-09-15 14:24:16
【问题描述】:

我在 Android 的后台服务中向服务器发送 HTTP 请求。只有当设备通过 USB 电缆连接到计算机时,他才能正常工作。如果设备未连接到计算机 - 服务仍会发送请求,但它们没有到达服务器。如果我再次将设备插入计算机 - 所有发送的请求都会立即发送到服务器。

我正在使用 AsyncTask 发送请求。

Web 服务运行良好,我使用 hurl.it 对其进行了测试 我不明白这是什么原因。

已编辑:
我正在发送请求 ->

        URL url = null;
    URLConnection connection = null;

    InputStream inputStream = null;

    String strURL = String.format("%s/%s", serviceURL, params);
    try{
    url = new URL(strURL);
    connection = url.openConnection();
    connection.connect();

    inputStream = new BufferedInputStream(url.openStream());
    }catch(IOException ioe){
        ioe.printStackTrace();
    }

工作解决方案
我真的很震惊,当我发现对服务器的请求不仅应该从后台线程中调用,还应该通过提供接口的回调构造来调用。

在我的服务中,我正在启动 AsyncTask

MyTask task = new MyTask(); 
task.execute((Void)null);

并在服务类中实现接口AsyncTaskHost

...
@Override
public void onTaskStart(){
    // sending http request to server using method from above
}
@Override
public void onTaskFinish(){
    // doing additional work here, after getting response from request
}

我的界面:

public interface AsyncTaskHost{
    public void onTaskStart();
    public void onTaskFinish();
}

我的异步任务类:

public class UploadCoordinates extends AsyncTask<Void, Integer, Void> {
private AsyncTaskHost taskHost;
private Context context;

public UploadCoordinates(Context context, AsyncTaskHost taskHost) {
    this.taskHost = taskHost;
    this.context = context;
}

@Override
protected Void doInBackground(Void... params) {
    taskHost.onTaskStart();

    return null;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected void onProgressUpdate(Integer... progress) {
    super.onProgressUpdate(progress);
}

@Override
protected void onPostExecute(Void param) {
    if (isCancelled()) {
        return;
    }

    taskHost.onUploadFinish();
}
}

现在一切正常。没有接口,异步任务不想在没有 USB 电缆的情况下工作。我不知道,这对我来说很神奇(或 Android 操作系统阻止所有请求、端口或类似的东西)。

【问题讨论】:

  • 你能把你的代码和没有连接到电脑时出现的错误..!!
  • 没有收到错误 - 与计算机是否连接无关。看起来我在不连接计算机的情况下无法发送 http 请求,是端口被阻止还是什么,我不知道。

标签: android httprequest


【解决方案1】:

看看这是否有帮助:

URL url = null;
InputStream inputStream = null;

String strURL = String.format("%s/%s", serviceURL, params);
HttpClient httpclient = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000);

 try{
    url = new URL(strURL);
    HttpPost httppost = new HttpPost(url);

    HttpResponse response = httpclient.execute(httppost);

    inputStream = new BufferedInputStream(url.openStream());
  }catch(IOException ioe){
    ioe.printStackTrace();
}

【讨论】:

  • @VeaceslavGaidarji-对不起!!
  • 如果我使用你发布的 httpclient 示例,他会收到我的响应代码 405“方法不允许”。但 BufferedInputStream 仍然可以正常工作并向服务器发送请求(只需插入 USB 电缆 :()
  • 是的,我也尝试过使用 Http "GET" 方法,插入 USB 电缆也可以正常工作。现在我尝试不是从后台服务发送请求,而是从主要活动发送请求。没有 USB 线仍然无法工作。
  • @VeaceslavGaidarji-那么在 JAVA 类之外出了点问题……可能在清单文件中……
【解决方案2】:

根据您的喜好,您也可以从 jsoup.org 试用 jsoup

判断它仅在连接 USB 电缆时才有效,这有点奇怪。尝试在您的计算机上停用您的互联网并仅在您的手机上启用它。可能是某些常规 Internet 共享设置受到干扰。

【讨论】:

  • 是的,我也这么认为。但在其他地方找到了解决方案。查看编辑后的帖子;)
【解决方案3】:

我知道我正在回答的帖子有点旧,因为我遇到了同样的问题,它消化了我 2-3 个小时来解决。问题是通过模拟器向“本地”服务器发送请求时,如果你写了

http://localhost:8080/yourapp/yourServelt

它不会向服务器发送请求。您必须提及您机器的 IP 地址,即

http://10.0.0.15:8080/yourapp/yourServlet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多