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 OSがすべてのリクエスト、ポートなどをブロックしています)。

4

3 に答える 3

0

やりたいことに応じて、jsoup.org から jsoup を試すこともできます。

USBケーブルが接続されている場合にのみ機能すると判断すると、少し奇妙です. コンピューターでインターネットを無効にして、電話でのみ有効にしてみてください。一部の一般的なインターネット共有設定が干渉している可能性があります。

于 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 に答える