Получение возвращаемого значения из залпа onResponse
Я пытаюсь сделать свою первую настоящую программу, так что будь проще для меня. Эта часть преобразует введенный почтовый индекс в координаты широты / долготы с помощью API-интерфейса Google и залпа, но я не могу понять, как заставить функции залпа "возвращать" координаты. Из того, что я прочитал, мне нужно реализовать метод обратного вызова, но я не могу понять, как это сделать.
//Converts values in TextView to String
locationurl = address.getText().toString();
//RequestQueue Variable
RequestQueue mRequestQueue;
// Instantiate the cache and set up the network to use HttpURLConnection as the HTTP client.
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap
BasicNetwork network = new BasicNetwork(new HurlStack());
//Instantiate the RequestQueue with the cache and network
mRequestQueue = new RequestQueue(cache, network);
//Start Queue
mRequestQueue.start();
String addressurl = "http://maps.googleapis.com/maps/api/geocode/json?address=" + location;
//Formulate the request and handle the response
StringRequest address = new StringRequest(Request.Method.GET, addressurl,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
coordinates = parseLocation(response);
if((coordinates == null && coordinates.isEmpty())||coordinates.equals("NOT_VALID_ADDRESS")) {
showAlert("Please Enter A Valid Zip Code");
} else {
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
showAlert("Error."); //Error code display
//TODO: fix error handling
}
});
mRequestQueue.add(address); //Add address to ResponseQueue
2 ответа
Измени свой onResponse
метод для:
@Override
public void onResponse(String response) {
coordinates = parseLocation(response);
if((coordinates == null && coordinates.isEmpty())||coordinates.equals("NOT_VALID_ADDRESS")) {
showAlert("Please Enter A Valid Zip Code");
} else {
useCoordinates(coordinates);
}
}
Затем реализуйте метод, который использует координаты:
public void useCoordinates(Location coordinates) {
// Use the value
}
Я думаю, что вы хотите сделать что-то вроде этого:
Это будет ваш класс обратного вызова: (NetworkResponse.java)
public abstract class NetworkResponse<T> implements Response.Listener<T>, Response.ErrorListener {
@Override
public void onResponse(T t) {
String coordinates = parseLocation(t);
onCoordinatesReceived(coordinates;
}
@Override
public void onErrorResponse(VolleyError volleyError) {
onCoordinatesReceived("");
}
public String parseLocation(T s) {
return null;
//Implement parsing here.
}
public abstract void onCoordinatesReceived(String coordinates) ;
}
И внесите следующие изменения в существующий класс:
StringRequest address = new StringRequest(Request.Method.GET, addressurl,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
coordinates = parseLocation(response);
if((coordinates == null && coordinates.isEmpty())||coordinates.equals("NOT_VALID_ADDRESS")) {
showAlert("Please Enter A Valid Zip Code");
} else {
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
showAlert("Error."); //Error code display
//TODO: fix error handling
}
});
mRequestQueue.add(address); //Add address to ResponseQueue
--- до ---
NetworkResponse<String> networkResponse =
new NetworkResponse<>() {
@Override
public void onCoordinatesReceived(String coordinates){
//Here are your coordinates.
if((coordinates == null && coordinates.isEmpty())||coordinates.equals("NOT_VALID_ADDRESS")) {
showAlert("Please Enter A Valid Zip Code");
else {
//Your implementation here.
}
}
StringRequest address = new StringRequest(Request.Method.GET, addressurl,
networkResponse, networkResponse);
mRequestQueue.add(address); //Add address to ResponseQueue
Пожалуйста, обратите внимание: NetworkResponse в вашем классе обратного вызова здесь.