3

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ファイルを調べましたが、何を言っているのかわかりません-.-

4

2 に答える 2

0

次のコードをテストしました。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

/**
 *
 * @author paro
 */
public class JavaApplication1 {

    public boolean req_aborted = false;
    public Thread timeout_request = new Thread(new Runnable() {
    public void run() {
        try{
            System.out.println("start");
            Thread.sleep(30000);
            System.out.println("awake");
            if(req_aborted ==false)
            {
                req_aborted = true;
                System.out.println("flag change");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
});
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        JavaApplication1 jap = new JavaApplication1();
        jap.timeout_request.start();
        System.out.println("requset started");
        if(jap.req_aborted)
        {
            System.out.println("flag is true now");
        }
    }
}

出力は

requset started
start
awake
flag change

コードのスレッド関連部分に問題はないようです。

そして、コードのロジックは、「アウェイク」を出力する必要があると言っています。次のステートメントに問題があるようです

final HttpResponse resp = httpClient.execute(post);
于 2012-09-28T08:22:37.020 に答える
0

を使用するのではなく、 を使用Thread.sleepする必要があると思いますHandler.postDelayedドキュメントをご覧ください。

何かのようなもの:

Handler mHandler = new Handler();
...
mhandler.postDelayed(new Runnable() {
    public void run() {
        if(!httprequest_finished){
            request_aborted = true;
            mHttpClient.getConnectionManager().shutdown();
        }
    }
}, 30000);

Runnableこれにより、指定された遅延の後に渡されたものが実行されます。

于 2012-09-28T09:00:09.897 に答える