2012-09-24 518 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