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