有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java的最后一个参数必须是返回类型或回调?

我目前正在为我的武术组织开发一个应用程序,在这个应用程序中,我希望它显示一张地图,上面有图钉,显示每个武术道场在我所在州的位置。我使用片段来实现这一点,就像在应用程序中,你可以通过抽屉开关访问地图一样。我的LocationFragment扩展了SupportMapFragment并实现了OnMapReadyCallback。然而,当我打开“位置”选项卡时,地图开始加载,然后崩溃。这是通过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.安卓.gms.maps.SupportMapFragment$zza$1.zza(Unknown Source)
                                                       at com.google.安卓.gms.maps.internal.zzt$zza.onTransact(Unknown Source)
                                                       at 安卓.os.Binder.transact(Binder.java:387)
                                                       at zu.a(:com.google.安卓.gms.DynamiteModulesB:82)
                                                       at maps.ad.t$5.run(Unknown Source)
                                                       at 安卓.os.Handler.handleCallback(Handler.java:739)
                                                       at 安卓.os.Handler.dispatchMessage(Handler.java:95)
                                                       at 安卓.os.Looper.loop(Looper.java:158)
                                                       at 安卓.app.ActivityThread.main(ActivityThread.java:7224)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                       at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我知道这个错误与我的PinsApiInterface有关。getStreams,我通过2访问它,但我不确定如何解决这个问题。我和Tutsplus的同事们一起关注他们是如何将地图实现到他们的zoo应用程序中的(我正在查看的代码是here)。在他们的教程中,他们使用了一个旧版本的改型,它使用public void success()public void failure()作为其PinsApiInterface.getStreams()下的覆盖。在改型2中,这已更改为onResponse()onFailure()。我已经搜索了多个不同的线程来解决这个崩溃,但我没有任何运气。我希望我能在如何解决这个问题上得到一些帮助。我对在安卓系统中使用改型2还很陌生,所以如果有任何帮助,我将不胜感激。下面是我的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 );
}

共 (1) 个答案

  1. # 1 楼答案

    看起来你把改装和改装混合在一起了RestAdapter是改型1,但{}与{}和{}是改型2

    首先,查看gradle文件中的依赖项,您将需要以下内容

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

    并删除“com”表单中的所有LIB。收拾一下。改装…’。这就是旧库的引入,也是混合使用这两个库时没有出现编译时错误的部分原因

    对于您的服务,不再指定回调,它有一个新的基于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
          }
    });