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