2016-12-03 4 views
0

私は現在、私の武道組織のためのアプリを開発しています。アプリ内では、それぞれの武道のdojosが私の州にどこにあるのかを示すピンのある地図を表示します。私はあなたが引き出しのトグルから地図にアクセスするアプリのように、断片を使ってこれをやっています。私のLocationFragmentSupportMapFragmentを拡張し、OnMapReadyCallbackを実装しています。ただし、[場所]タブを開くと、地図が読み込まれてからクラッシュします。これはAndroidのモニター伝わってくるエラーです:戻り値の型またはコールバックが最後の引数として必要ですRetrofit2 Android?

java.lang.IllegalArgumentException: PinsApiInterface.getStreams: Must have either a return type or Callback as last argument. 
                 at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:107) 
                 at retrofit.RestMethodInfo.parseResponseType(RestMethodInfo.java:270) 
                 at retrofit.RestMethodInfo.<init>(RestMethodInfo.java:97) 
                 at retrofit.RestAdapter.getMethodInfo(RestAdapter.java:213) 
                 at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:236) 
                 at java.lang.reflect.Proxy.invoke(Proxy.java:393) 
                 at $Proxy0.getStreams(Unknown Source) 
                 at com.mycompany.kfcomapplication.fragments.LocationFragment.onMapReady(LocationFragment.java:85) 
                 at com.google.android.gms.maps.SupportMapFragment$zza$1.zza(Unknown Source) 
                 at com.google.android.gms.maps.internal.zzt$zza.onTransact(Unknown Source) 
                 at android.os.Binder.transact(Binder.java:387) 
                 at zu.a(:com.google.android.gms.DynamiteModulesB:82) 
                 at maps.ad.t$5.run(Unknown Source) 
                 at android.os.Handler.handleCallback(Handler.java:739) 
                 at android.os.Handler.dispatchMessage(Handler.java:95) 
                 at android.os.Looper.loop(Looper.java:158) 
                 at android.app.ActivityThread.main(ActivityThread.java:7224) 
                 at java.lang.reflect.Method.invoke(Native Method) 
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

私はエラーが私がRetrofit2を経由してアクセスする私のPinsApiInterface.getStreams、とは何かを持っていることを理解し、私は問題を解決するかどうかはわかりません。私はTutsplusの人たちと一緒に、どのように彼らが動物園のアプリケーションにマップを実装しているか(私が見ているコードはhereです)。彼らのチュートリアルでは、の下に上書きとしてpublic void success()public void failure()を使用する古いバージョンのRetrofitを使用しています。 Retrofit2では、これはonResponse()onFailure()に変更されました。私はこのクラッシュを修正する方法について複数の異なるスレッドを検索しましたが、私は運がありませんでした。私はこの問題を解決する方法についていくつかの助けを得ることができることを願っていました。私はAndroidでRetrofit2を使用するのがとても新しいので、どんな助けでも大歓迎です。以下は私のLocationFragment.javaと私のPinsApiInterface.javaのコードです。ここ はLocationFragment.javaです:

public class LocationFragment extends SupportMapFragment implements OnMapReadyCallback { 

    public static LocationFragment getInstance() { 
     LocationFragment fragment = new LocationFragment(); 

     return fragment; 
    } 
    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 

     super.onViewCreated(view, savedInstanceState); 

     getMapAsync(this); 
    } 

    @Override 
    public void onMapReady(final GoogleMap googleMap) { 
     CameraPosition position = CameraPosition.builder() 
       .target(new LatLng(42.921966, -85.718533)) 
       .zoom(16f) 
       .bearing(0.0f) 
       .tilt(0.0f) 
       .build(); 

     googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(position), null); 
     googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     googleMap.setTrafficEnabled(true); 

     googleMap.getUiSettings().setZoomControlsEnabled(true); 

     MarkerOptions options = new MarkerOptions().position(new LatLng(42.921966, -85.718533)); 
     options.title("KFCOM"); 
     options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)); 
     googleMap.addMarker(options); 

     googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
      @Override 
      public boolean onMarkerClick(Marker marker) { 
       marker.showInfoWindow(); 
       return true; 
      } 
     }); 

     RestAdapter adapter = new RestAdapter.Builder() 
       .setEndpoint("https://gist.githubusercontent.com/anonymous/101ffbf7e1aed60b7caf7d3d5418bfde/raw/43b5d1fa6862fd1dce84044821cdf1a9d48b6ca2") 
       .build(); 
     PinsApiInterface pinsApiInterface = adapter.create(PinsApiInterface.class); 

     //This line is what is causing the crash. 
     pinsApiInterface.getStreams(new Callback<List<Pin>>() { 
      @Override 
      public void onResponse(Call<List<Pin>> pins, Response<List<Pin>> response) { 
       if(!isAdded() || pins == null || pins.equals("")) 
       { 
        return; 
       } 

       for(Pin pin : response.body()) { 
        MarkerOptions options = new MarkerOptions().position(new LatLng(pin.getLatitude(), pin.getLongitude())); 
        options.title(pin.getName()); 
        options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); 
        googleMap.addMarker(options); 
       } 
      } 

      @Override 
      public void onFailure(Call<List<Pin>> call, Throwable t) { 

      } 
     }); 
    } 
} 

そして、ここではPinsApiInterface.javaです:

public interface PinsApiInterface { 
    @GET("/Pins.json") 
    void getStreams(Callback<List<Pin>> callback); 
} 

答えて

2

あなたはretrofit2と改造を混合しているように見えます。 RestAdapterはレトロフィット1ですが、CallbackonResponseonErrorはレトロフィット2です。

まず、あなたのGradleファイルにあなたの依存関係を見て次のことを必要としている -

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 

と、フォームのいずれかのLIBS削除 - 「com.squareup.retrofitを... 'それは古いライブラリを引っ張っていて、2つを混ぜるときにコンパイル時にエラーが出なかった理由の一部です。

サービスのために、コールバックは指定されなくなりました。新しいCallベースのインターフェイスがあります。 Callを使用すると、リクエスト時に非同期と非同期を選択できます。 -

public interface PinsApiInterface { 
    @GET("/Pins.json") 
    Call<List<Pin>> getStreams(); 
} 

この古い改造コードに置き換え -

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl("https://gist.githubusercontent.com/anonymous/101ffbf7e1aed60b7caf7d3d5418bfde/raw/43b5d1fa6862fd1dce84044821cdf1a9d48b6ca2") 
    .addConverterFactory(GsonConverterFactory.create()) 
    .build(); 
PinsApiInterface pinsApiInterface = retrofit.create(PinsApiInterface.class); 

最後に、非同期を作る新しい方法 - あなたのサービス・インターフェースを構築する新しい方法で

RestAdapter adapter = new RestAdapter.Builder() 
       .setEndpoint("https://gist.githubusercontent.com/anonymous/101ffbf7e1aed60b7caf7d3d5418bfde/raw/43b5d1fa6862fd1dce84044821cdf1a9d48b6ca2") 
       .build(); 
PinsApiInterface pinsApiInterface = adapter.create(PinsApiInterface.class); 

をコール -

Call<List<Pin>> myCall = pinsApiInterface.getStreams(); 
myCall.enqueue(new Callback<List<Pin>>() { 
     @Override 
     public void onResponse(Call<List<Pin>> call, Response<List<Pin>> response) { 
      // your response code 
     } 

     @Override 
     public void onFailure(Call<List<Pin>> call, Throwable t) { 
     // your failure code 
     } 
}); 
+0

ああ、私私がミックスアップしたように見えません。改造と改造2。私の問題が今どこにあるかを見ます!それは私が持っていたエラーを修正するようだ。 onResponseコード内の "forループ"に間違っているものが原因でアプリケーションがまだクラッシュしているように見えますが、うまくいけば分かります。ありがとう! –

関連する問題