2017-09-28 4 views
2

私はスレッドを読んでいますが、それは私のためには機能しません。私はEditTextTextWatcherを持っており、Google PlacesAutocompleteを使用してプレイスアドレスを取得するので、入力された各文字は新しいリクエストですが、入力した各文字は以前のリクエストをキャンセルする必要があります。重要なのは入力された最終アドレスです。私はこれを行いました:OkHttp Androidでリクエストを取り消す方法

更新!

Address.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      if(Address.getText().toString().length() > 3){ 
       _Address = Address.getText().toString(); 
       if(call != null){ 
        call.cancel(); 
       } 

       Request request = new Request.Builder() 
         .url(getPlaceAutoCompleteUrl(_Address)) 
         .addHeader("content-type", "application/json") 
         .addHeader("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; google_sdk Build/MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30") 
         .build(); 
       Call call = new OkHttpClient().newCall(request); 
       call.enqueue(new Callback() { 
        @Override 
        public void onFailure(Call call, IOException e) { 

        } 
        @Override 
        public void onResponse(Call call, Response response) throws IOException { 
         Log.d("Response",response.body().string()); 
         PlacePredictions place = LoganSquare.parse(response.body().string(),PlacePredictions.class); 
         if(autoCompleteAdapter == null){ 
          autoCompleteAdapter = new AutoCompleteAdapter(CustomPlaces.this); 
          recyclerView.setAdapter(autoCompleteAdapter); 
          autoCompleteAdapter.Add(place.getPlaces()); 
         }else { 
          autoCompleteAdapter.Clear(); 
          autoCompleteAdapter.Add(place.getPlaces()); 
          autoCompleteAdapter.notifyDataSetChanged(); 
         } 
        } 
       }); 
       //call.cancel(); 
      } 

例外:

E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 
              Process: com.app, PID: 2660 
              java.lang.IllegalStateException: closed 
               at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:398) 
               at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:392) 
               at okhttp3.internal.Util.bomAwareCharset(Util.java:449) 
               at okhttp3.ResponseBody.string(ResponseBody.java:174) 
               at com.ustork.CustomPlaces$2$1.onResponse(CustomPlaces.java:89) 
               at okhttp3.RealCall$AsyncCall.execute(RealCall.java:153) 
               at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
               at java.lang.Thread.run(Thread.java:818) 

答えて

3

どのようにあなたの問題に別のアプローチをしようとのことですか?

Call call = new OkHttpClient().newCall(your request); 
    call.enqueue(new Callback() { // call off UI thread. 
     @Override 
     public void onFailure(Call call, IOException e) { 
      // this is where your call is cancelled: call.isCanceled() 
     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 

     } 
    }); 
    call.cancel(); // this is the proper way to cancel an async call. 

更新:あなたはasyncTaskを使用せずにOkHttpでこのような何かを行うことができます

あなたがthe response body is a one-shot value that may be consumed only once、あなたが二回response.body().string()を呼ぶべきではないことに注意すべきです。ローカル変数:responseString = response.body().string()を作成して使用してください。

+0

したがって、呼び出しオブジェクトがnullであるかどうか、新しい呼び出しごとに 'call.cancel();'を確認できますか?その場合、私は前に置くだろうか?ありがとう! –

+0

私はその方法を使用しようとしましたが、私は致命的な例外を取得しています、私は私のコードを更新します! –

関連する問題