我需要能够使用OKHTTP使用管理器接收一些请求,通过键入地址来使用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对象是否为null,并取消请求,但仍然会继续出现!
发布于 2017-09-28 20:20:52
关于以下几点:
//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();
}发布于 2017-09-29 20:43:26
延迟请求到服务器,并张贴它只有当输入没有改变的超时(1000毫秒,调整为更好的感觉)。您可以向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);
}
}https://stackoverflow.com/questions/46477195
复制相似问题