gpt4 book ai didi

java - 必须有返回类型或回调作为最后一个参数 Retrofit2 Android?

转载 作者:行者123 更新时间:2023-12-02 03:11:42 25 4
gpt4 key购买 nike

我目前正在为我的武术组织开发一个应用程序,在该应用程序中,我希望它显示一张带有图钉的 map ,显示我所在州的每个武术道场的位置。我使用 fragment 来执行此操作,就像在应用程序中您可以通过抽屉切换访问 map 一样。我的 LocationFragment 扩展了 SupportMapFragment 并实现了 OnMapReadyCallback。但是,当我打开“位置”选项卡时, map 开始加载,然后崩溃。这是通过 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 的人一起关注他们如何在动物园应用程序中实现 map (我正在查看的代码位于 here )。在他们的教程中,他们使用的是旧版本的 Retrofit,该版本使用 public void success()public void failure() 作为其 PinsApiInterface.getStreams( )。在 Retrofit2 中,这已更改为 onResponse()onFailure()。我已经搜索了多个不同的线程来了解如何修复此崩溃,但我没有任何运气。我希望能够就如何解决这个问题获得一些帮助。我对在 Android 中使用 Retrofit2 还很陌生,因此我们将不胜感激。下面是我的 LocationFragment.javaPinsApiInterface.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混合在一起。 RestAdapter 是 Retrofit 1,但带有 onResponseonErrorCallback 是 Retrofit2。

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

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

并删除任何形式为“com.squareup.retrofit...”的库。这就是引入旧库,也是混合两者时没有出现编译时错误的部分原因。

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

使用构建服务接口(interface)的新方法--

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
}
});

关于java - 必须有返回类型或回调作为最后一个参数 Retrofit2 Android?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40951733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com