Android Java JsonObjectRequests のコールバックを実装しようとしています。ほぼそのままのコードを示す投稿が何十も見つかりました。私の問題は、callback
がnullであることです。2 つのインライン コメントを参照してください。
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);
}
}
明確にするために、テスト中にcallback
null ではないことに一度だけ注意しました。それ以来、繰り返し実行によって null 以外のコールバックが生成されることはありません。私は Java を始めてまだ 8 日しか経っていません。
DispatchBuddyBase
シングルトンは、メイン アクティビティで 1 回だけインスタンス化されますDBVolley
。追加のすべての参照は、 経由で同じものを取得しDispatchBuddyBase.getInstance()
ます。他の場所では匿名クラスに問題はありませんでした。
Volley コードは骨組みであり、リクエストを問題なく起動します。JsonObjectRequest は、私が Google から期待するすべてのものを正常に取得します。このコールバックを除いて、他のすべては順調に機能しています。
このコールバックを正しく渡すには、何を修正する必要がありますか?