2016-12-03 26 views
0

我目前正在为我的武术组织开发一个应用程序,并且在应用程序中,我希望它能够显示一张地图,并显示每个武术道具在我所在州的位置。我正在使用片段来做这件事,就像你在应用程序中从抽屉切换器访问地图一样。我的LocationFragment扩展为SupportMapFragment,并执行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) 

我的理解是错误有事情做与我PinsApiInterface.getStreams,我通过Retrofit2访问,但我不知道如何解决这个问题。我跟着Tutsplus的家伙一起关注着他们如何在他们的动物园应用程序中实现一个地图(我看到的代码是here)。在他们的教程中,他们正在使用旧版本的Retrofit,它使用public void success()public void failure()作为覆盖它们的PinsApiInterface.getStreams()。随着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是Retrofit 1,但CallbackonResponseonError是Retrofit2。

首先,看看你gradle这个文件你的依赖,你会需要以下 -

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

,并删除表格中的任意库 - “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

啊是啊,我t看起来像我混淆了Retrofit和Retrofit 2.我看到我的问题现在在哪里!这似乎解决了我遇到的错误。看起来应用程序仍然崩溃,因为我的onResponse代码中的“for循环”中出现了错误,但我希望能够将其整理出来。谢谢! –

相关问题