我需要能够使用 OKHTTP MANAGER 一些请求,使用Google Places AutoComplete
通过键入地址来接收一些预测。 问题每次插入 CHAR 时,它都会发出新请求,但同时我需要取消之前的请求!例如:同时纽约市= 13个请求!所以我使用Call
的单个实例尝试取消已经请求但没有成功的任何内容。这就是我做的!
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 = client.newCall(request);
call.enqueue(new Callback() {
public void onResponse(Call call, final Response response) throws IOException {
final String result = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("Response",result);
PlacePredictions place = null;
try {
place = LoganSquare.parse(result,PlacePredictions.class);
} catch (IOException e) {
e.printStackTrace();
}
if(autoCompleteAdapter == null){
autoCompleteAdapter = new AutoCompleteAdapter(CustomPlaces.this);
recyclerView.setAdapter(autoCompleteAdapter);
autoCompleteAdapter.Add(place.getPlaces());
}else {
autoCompleteAdapter.Clear();
autoCompleteAdapter.Add(place.getPlaces());
autoCompleteAdapter.notifyDataSetChanged();
}
}
});
}
public void onFailure(Call call, IOException e) {
//fail();
}
});
}else {
if(autoCompleteAdapter != null){
autoCompleteAdapter.Clear();
}
}
}
我检查call
对象是否为空并取消请求但仍然继续!
答案 0 :(得分:7)
以下内容如何:
//Set tags for your requests when you build them:
Request request = new Request.Builder().
url(url).tag("requestKey").build();
//When you want to cancel:
//A) go through the queued calls and cancel if the tag matches:
for (Call call : mHttpClient.dispatcher().queuedCalls()) {
if (call.request().tag().equals("requestKey"))
call.cancel();
}
//B) go through the running calls and cancel if the tag matches:
for (Call call : mHttpClient.dispatcher().runningCalls()) {
if (call.request().tag().equals("requestKey"))
call.cancel();
}
答案 1 :(得分:1)
延迟请求到服务器并仅在超时输入未更改时发布(1000 ms,调整以获得更好的感觉)。您可以将取消方法添加到GetHintsRequest
...
Address.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
if (s.length() < 3) {
if (autoCompleteAdapter != null) {
autoCompleteAdapter.Clear();
}
return;
}
GetHintsRequest request = new GetHintsRequest(s.toString(), new GetHintsRequest.GetHintsCallback() {
@Override
public boolean isRequestNotChanged(String oldRequest) {
return Address.getText().toString().equals(oldRequest);
}
@Override
public void onGotHints(String request, PlacePredictions predictions) {
if (autoCompleteAdapter == null) {
autoCompleteAdapter = new AutoCompleteAdapter(CustomPlaces.this);
recyclerView.setAdapter(autoCompleteAdapter);
autoCompleteAdapter.Add(place.getPlaces());
} else {
autoCompleteAdapter.Clear();
autoCompleteAdapter.Add(place.getPlaces());
autoCompleteAdapter.notifyDataSetChanged();
}
}
});
request.postCheck();
}
});
...
public class GetHintsRequest {
private static final long TIMEOUT_MS = 1000; // timeout
private final String requestText;
private final GetHintsCallback callback;
// android.os.Handler, can be used to post and delayed post to main thread. activity.runOnUiThread uses it
private final Handler handler = new Handler(Looper.getMainLooper());
public GetHintsRequest(String requestText, GetHintsCallback callback) {
this.requestText = requestText;
this.callback = callback;
}
public void postCheck() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (callback.isRequestNotChanged(requestText)){
execute();
}
}
}, TIMEOUT_MS);
}
public void execute() {
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 = client.newCall(request);
call.enqueue(new Callback() {
public void onResponse(Call call, final Response response) throws IOException {
final String result = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
Log.d("Response", result);
PlacePredictions place = null;
if (callback.isRequestNotChanged(requestText)) {
try {
place = LoganSquare.parse(result, PlacePredictions.class);
} catch (IOException e) {
e.printStackTrace();
return;
}
callback.onGotHints(requestText, place);
}
}
});
}
public void onFailure(Call call, IOException e) {
//fail();
}
});
}
public interface GetHintsCallback {
boolean isRequestNotChanged(String oldRequest);
void onGotHints(String request, PlacePredictions predictions);
}
}