0

そのため、現在、BasicHttpClient を呼び出してインターネットから Http 応答を取得する非同期呼び出しを実装しようとしています。Http クライアントが作業を完了すると、Callee クラスのメソッドの 1 つが呼び出されます。

一般的に、私の実装は次のようになります。

public class BasicHttpClientAsync {
    private OnRequestFinishedListener mListener;

    public interface OnRequestFinishedListener {
        public void onRequestFinished(HttpResponse httpResponse);

        public void onRequestFinished(ClientProtocolException e);

        public void onRequestFinished(IOException e);
    }

    public BasicHttpClient(OnRequestFinishedListener listener) {
        this.mListener = listener;
    }

    private Runnable task = new Runnable() {
        @override
        public void run() {
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(URL);
            HttpResponse httpResponse = httpClient.execute(httpGet);

            mListener.onRequestFinished(httpResponse);
        }
    };

    public void getResponse() {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        FuturkTask<?> futureTask = new FutureTask<Object>(task, null);
        executor.execute(futureTask);
    }
}

public class Callee implements OnRequestFinishedListener {
    public void getResult() {
        BasicHttpClientAsync httpClient = new BasicHttpClientAsync(this);
        httpClient.getResponse();
    }

    @override
    public void onRequestFinished(HttpResponse httpResponse) {
        System.out.println(httpResponse.toString());
    }
}

コードは大幅に簡素化され、main() メソッドは Callee クラスの getResult() メソッドを呼び出します。ところで、すべての例外が処理され、コールバックを使用して呼び出し先に送り返します。

ただし、Callee クラスの「onRequestFinished」は呼び出されないようです。

助けてください。

4

2 に答える 2

0

それは、Apache の HttpComponents のすべての jar ファイルを Java ビルド パスに追加しなかったためであり、これにより HttpClient mHttpClient = new DefaultHttpClient() が例外をスローします。ただし、Runnable を使用しているため、その例外をキャッチする方法はありません。

于 2012-04-25T02:11:40.883 に答える
0

1 つの可能性は、内部のどこかでrun例外がスローされ、実行フローがリスナーへの呼び出しに到達しないことです。

ところで、executorすべての呼び出しで作成する必要はありません。これにより、着信作業を待機する事前に作成されたスレッドをプールするというエグゼキューターの利点が減少します。BasicHttpClientAsyncコンストラクター パラメーターのエグゼキューター パラメーターを作成します。

public class Callee implements OnRequestFinishedListener {
      private final ExecutorService executor = Executors.newSingleThreadExecutor();
 ...
      BasicHttpClientAsync httpClient = new BasicHttpClientAsync(this, executor);
 ...
于 2012-04-19T19:57:33.053 に答える