Já jsem se snaží zavést zpětné volání pro Android Java JsonObjectRequests. Zjistil jsem, desítky míst ukazující kód, který je téměř doslovně. Můj problém je, že callbackje nulová. Podívejte se na dvě vložené poznámky.
public interface JsonObjectCallbackInterface {
void onSuccess(JSONObject result);
}
class DispatchBuddyBase {
//...
public void addGmapMarker(String inAddress) {
final String address = DBB.prepareAddress(inAddress);
DatabaseReference ref = DBB.getTopPathRef(/geocodedAddresses);
ref.orderByChild(address)
.equalTo(address)
.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.i(TAG, address+ stored: +dataSnapshot.exists());
if (!dataSnapshot.exists()) {
DBB.getLatLng(
17 River Rd Meriden CT 06451,
new JsonObjectCallbackInterface() {
// ^--- why is this passing a **null?**
@Override
public void onSuccess(JSONObject response) {
Log.i(TAG, got a json body:+response.toString());
addGmapMarker(response);
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
public class DispatchesActivity extends AppCompatActivity implements
OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
ResultCallback<LocationSettingsResult> {
//...
public void getLatLng(final String address,
final JsonObjectCallbackInterface callback) {
// why does this get a **null** callback? -------------^
Log.e(TAG, callback is: +callback);
String url = https://maps.googleapis.com/maps/api/geocode/json?address=
+ address;
JsonObjectRequest jsObjRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.e(TAG,Response: + response.toString());
DatabaseReference ref = getTopPathRef(/geocodedAddresses).push();
Map<String, Object> u = new HashMap<>();
u.put(address, address);
u.put(geocoded, response.toString());
ref.updateChildren(u, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if (databaseError != null) {
Log.e(TAG,Geocoded address could not be saved
+ databaseError.getMessage());
} else {
Log.e(TAG,Geocoded address saved successfully.);
}
}
});
Log.e(TAG, callback2 is: +callback);
callback.onSuccess(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
});
DBVolley.getInstance(context)
.addToRequestQueue(jsObjRequest);
}
}
Aby bylo jasno, já jsem kdysi na vědomí, že callbacknebyl null jen jednou , když jsem testoval. Opakujte běží nepřinesly nenulovou zpětné volání od té doby. Je mi teprve osm dnů v Javě, takže prosím omluvte, jestli jsem udělal něco naivní.
DispatchBuddyBaseSingleton instanced v hlavní činnosti pouze jednou, a DBVolleypodobně. Všechny další odkazy získat stejný via DispatchBuddyBase.getInstance(). Neměl jsem žádné problémy s anonymních tříd jinde.
Salvami kód je holé kosti a vystřelí z požadavků v pohodě se JsonObjectRequest úspěšně dostane vše, co očekáváte od společnosti Google. Všechno ostatní funguje bobtnat kromě této zpětné volání.
Co je potřeba opravit správně předat tento zpětné volání?













