1

我正在通过在 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 操作系统会阻止所有请求、端口或类似的东西)。

4

3 回答 3

0

取决于你想做什么,你也可以从 jsoup.org 尝试 jsoup

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

于 2012-09-24T09:34:50.277 回答
0

看看这是否有帮助:

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();
}
于 2012-09-24T06:50:35.813 回答
0

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

http://localhost:8080/yourapp/yourServelt

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

http://10.0.0.15:8080/yourapp/yourServlet
于 2013-09-16T08:09:03.133 回答