httprequestのあるアプリがあります。そのリクエストのタイムアウトを設定したかったのですが、DNSタイムアウトを制御できないため、stackoverflowのユーザーは、一定時間後にリクエストをキャンセルするタイマー付きのスレッドを作成することを提案しました。それが私が行っていることです。
新しいスレッドでは、Thread.sleepを使用して30秒間待機し、その時間が終了したら、リクエストが終了していない場合はリクエストをキャンセルしますが、スレッドがウェイクアップすることはありません。これは私のコードです:
private Thread timeout_request = new Thread(new Runnable() {
public void run() {
try{
Log.d(TAG, "Thread start");
Thread.sleep(30000);
Log.d(TAG, "Thread awake");
if(!httprequest_finished){
request_aborted = true;
mHttpClient.getConnectionManager().shutdown();
}
}catch(Exception e){
e.printStackTrace();
}
}
});
public String sendData(String token){
...
timeout_request.start();
Log.i(TAG, "Sending request");
final HttpResponse resp = httpClient.execute(post);
Log.i(TAG, "Execute finished");
if(request_aborted) return null;
httprequest_finished = true;
...
}
インターネットに接続せずにsendData関数を実行すると、ログに「Sending request」と「Threadstart」が表示されますが、「Threadawake」または「Executefinished」は表示されません(5分ほど待ちました)。何故ですか?
- - - 編集 - - -
ちなみに、それが重要かどうかはわかりませんが、接続にThreadSafeClientConnManagerを使用しています。
私はいくつかのことをテストしました:
1- HttpResponse resp = httpClient.execute(post)をwhile(!request_aborted)に置き換えます。スレッドが目覚めます(動作します)。
2-スレッドの代わりにmHandler.postDelayed(r、30000)を使用します。私はまだhttpClient.execute(post)を実行しています。結果:Runnableは起動されません。
private Handler mHandler = new Handler();
private Runnable r = new Runnable() {
public void run() {
Log.d(TAG, "Runnable()");
if(!httprequest_finished){
request_aborted = true;
mHttpClient.getConnectionManager().shutdown();
}
}
};
3-スレッドの代わりにmHandler.postDelayed(r、30000)を使用します。HttpResponse resp = httpClient.execute(post)をwhile(!request_aborted)に置き換えます。結果:Runnableは起動されません。
したがって、httpリクエストを実行していない場合はスレッドは機能しますが、ハンドラーは機能しません。ログに次の行があることに気づきました。
threadid=3: reacting to signal 3
Wrote stack traces to '/data/anr/traces.txt'
threadid=3: reacting to signal 3
Wrote stack traces to '/data/anr/traces.txt'
これは、スレッドの実行またはハンドラーの設定から6秒または7秒後に表示されます。私は使用しようとしました:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
Log.e("Alert","Lets See if it Works !!!");
}
});
ただし、ログに「動作するかどうかを確認しましょう!!!」と表示されることはありません。traces.txtファイルを調べましたが、何を言っているのかわかりません-.-