2016-12-03 1 views
0

В настоящее время я работаю над приложением для моей организации боевых искусств, и в приложении я хочу, чтобы он отображал карту с булавками, показывающими, где находятся все доджо боевых искусств в моем состоянии. Я делаю это с помощью фрагментов, так как в приложении вы получаете доступ к карте из переключателя выдвижного ящика. Мой LocationFragment расширяет SupportMapFragment и осуществляет OnMapReadyCallback. Однако, когда я открываю вкладку местоположений, карта начинает загружаться, а затем падает. Это ошибка, которая приходит через Android Monitor:Должен ли иметь тип возврата или обратный вызов как последний аргумент 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) 

Я понимаю, что ошибка есть что-то делать с моим PinsApiInterface.getStreams, которые я доступ через Retrofit2, но я не знаю, как решить эту проблему , Я следовал вместе с ребятами из Tutsplus и как они внедрили карту в свое приложение для зоопарка (в котором находится код, который я ищу, here). В своем учебнике они используют старую версию Retrofit, которая использует public void success() и public void failure() как переопределяет их PinsApiInterface.getStreams(). С Retrofit2 это было изменено на onResponse() и onFailure(). Я искал несколько разных тем о том, как исправить этот крах, но мне не повезло. Я надеялся, что смогу помочь в решении этой проблемы. Я довольно новичок в использовании Retrofit2 в Android, поэтому любая помощь будет высоко оценена. Ниже приведен код для моего 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, но Callback с onResponse и onError - Дооснащение2.

Во-первых, посмотрите на ваши зависимостей в вашем Gradle файле, вы будете нуждаться в следующем -

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

, а также удалить все LIBS вида - «com.squareup.retrofit ... ». Это потянет в старую библиотеку и часть того, почему вы не получили ошибки компиляции во время смешивания двух.

Для вашей службы обратные вызовы больше не указаны, у этого есть новый интерфейс, основанный на Call. Call позволяет вам выбирать синхронные асинхронные операции в то время, когда вы делаете запрос, а не когда вы его определяете. -

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

Заменить этот старый модифицированную код -

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

с новым методом построения вашего интерфейса сервиса -

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl("https://gist.githubusercontent.com/anonymous/101ffbf7e1aed60b7caf7d3d5418bfde/raw/43b5d1fa6862fd1dce84044821cdf1a9d48b6ca2") 
    .addConverterFactory(GsonConverterFactory.create()) 
    .build(); 
PinsApiInterface pinsApiInterface = retrofit.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

Ah yeah, i t выглядит так, как будто я перепутал Retrofit и Retrofit 2. Я вижу, где моя проблема сейчас! Это, похоже, исправить ошибку, которую я испытывал. Похоже, приложение все еще терпит крах из-за чего-то, что не так в моей «петле цикла» внутри моего кода onResponse, но я надеюсь, что это разобратся. Благодаря! –