2012-09-24 336 views
0

我正在Android中的后台服务中发送HTTP请求到服务器。只要设备通过USB电缆连接到计算机,他就可以正常工作。如果设备未连接到计算机 - 服务仍然发送请求,但它们未到服务器。如果我再次将设备插入计算机 - 所有发出的请求都会立即发送到服务器。从后台服务发送http请求到服务器失败

我使用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(); 
    } 

工作液
我真的shoked,当我发现,请求到服务器不应该仅仅从被称为后台线程,但带回调结构,提供接口。

在我的服务,我开始的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操作系统阻止所有请求,端口或类似的东西)。

+0

你可以把你的代码和未连接到计算机时发生的错误..! –

+0

没有收到错误 - 连接到计算机或没有关系。看起来像我不能发送HTTP请求,而不连接到计算机,被阻止端口或什么,我不知道。 –

回答

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(); 
} 
+0

“updatemsg”是什么意思? –

+0

@ VeaceslavGaidarji - 对不起! –

+0

如果我使用http发布的httpclient示例,他会收到我的回复代码405“不允许的方法”。但BufferedInputStream仍然正常工作,并发送请求到服务器(只需插入USB电缆:() –

0

取决于你想这样做,你也可以从jsoup.org

来看由它只能当你的USB电缆尝试jsoup什么连接有点奇怪。尝试在计算机上停用互联网,并仅在您的手机上启用它。这可能是因为一些通用的互联网共享设置存在干扰。

+0

是的,我想是的,但在其他地方找到解决办法。 –

0

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

http://localhost:8080/yourapp/yourServelt 

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

http://10.0.0.15:8080/yourapp/yourServlet