2017-07-07 2 views
1

Ich versuche, diese RetroFit + Otto tutorial zu aktualisieren, so dass mein Code aktualisiert ist:java.lang. RuntimeException Keine Annotation für Retrofit gefunden. (Parameter # 3)

IWeather.java

RetroFit 2. + erlaubt es nicht, void zurückzukehren, so statt void getWeather(...) Ich habe Call<Weather> getWeather(...) hinzugefügt.

public interface IWeather { 

    @GET("/{latitude},{longitude}") 
    Call<Weather> getWeather(@Path("latitude") String latitude, 
          @Path("longitude") String longitude, 
          Callback<Weather> callback); 
} 

ForecastClient.java

RetroFit 2. + hat seinen Konstruktor geändert, so dass die neue ForecastClient hat die nächste Form. Die IllegalArgumentException verweist auf die weather.getWeather(...) Methode.

public class ForecastClient { 

    private static final String BASE_URL = "https://api.darksky.net/forecast/"; 
    private static final String API_KEY = "******************"; 
    public static final String API_URL = BASE_URL + API_KEY + "/"; 

    private static ForecastClient mForecastClient; 
    private static Retrofit mRetroAdapter; 

    public static ForecastClient getClient() { 
     if (mForecastClient == null) { 
      mForecastClient = new ForecastClient(); 
     } 
     return mForecastClient; 
    } 

    private ForecastClient() { 
     mRetroAdapter = new Retrofit.Builder() 
       .baseUrl(API_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(new OkHttpClient()) 
       .build(); 
    } 

    public void getWeather(String latitude, String longitude, Callback<Weather> callback) { 
     IWeather weather = mRetroAdapter.create(IWeather.class); 
     weather.getWeather(latitude, longitude, callback); 
    } 
} 

ForecastManager.java

public class ForecastManager { 

    private Context mContext; 
    private Bus mBus; 
    private ForecastClient sForecastClient; 

    public ForecastManager(Context context, Bus bus) { 
     this.mContext = context; 
     this.mBus = bus; 
     sForecastClient = ForecastClient.getClient(); 
    } 

    @Subscribe 
    public void onGetWeatherEvent(GetWeatherEvent getWeatherEvent) { 
     String latitude = Double.toString(getWeatherEvent.getLatitude()).trim(); 
     String longitude = Double.toString(getWeatherEvent.getLongitude()).trim(); 

     Callback<Weather> callback = new Callback<Weather>() { 
      @Override 
      public void onResponse(Call<Weather> call, Response<Weather> response) { 
       Log.d(ForecastManager.class.getSimpleName(), response.body().toString()); 
       mBus.post(new SendWeatherEvent(response.body())); 
      } 

      @Override 
      public void onFailure(Call<Weather> call, Throwable t) { 
       Log.e(ForecastManager.class.getSimpleName(), t.getMessage()); 
      } 
     }; 

     sForecastClient.getWeather(latitude, longitude, callback); 
    } 
} 

Ich bin eine No Retrofit Anmerkung gefunden zu empfangen und ich denke, der Grund, warum etwas ist, mit meinem Rückruf verwendet, aber es ist ein RetroFit Rückruf, so dass ich don verstehe nicht warum der Fehler.

stacktrace verweist auf die MainActivity, insbesondere an der Otto-Verfahren post() mit einem java.lang.RuntimeException: Could not dispatch event, durch den Fehler verursacht hat zuvor erwähnt java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #3):

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    @BindView(R.id.activity_main_textView) 
    TextView textView; 
    @BindView(R.id.activity_main_button) 
    Button button; 

    private static final double LATITUDE = **.******; 
    private static final double LONGITUDE = **.******; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ButterKnife.bind(this); 
    } 

    @OnClick(R.id.activity_main_button) 
    public void onClick(View view) { 
     BusProvider.getInstace().post(new GetWeatherEvent(LATITUDE, LONGITUDE)); 
    } 

    @Subscribe 
    public void onSendWeatherEvent(SendWeatherEvent sendWeatherEvent) { 
     Weather weather = sendWeatherEvent.getWeather(); 
     Currently currently = weather.getCurrently(); 
     textView.setText(currently.getSummary()); 
    } 

Jeder Hinweis darüber, wo ist der Fehler oder wie soll ich mit den Busabonnements, dem Rückruf usw. umgehen?

Antwort

3

java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #3)

Da der Fehler sagt, das Problem ist, dass der dritte Parameter der getWeather Methode nicht eine Anmerkung hat. Die Klasse Callback wird für die Methode Call#enqueue(Callback) verwendet.

Ändern Sie einfach sForecastClient.getWeather(latitude, longitude, callback) in sForecastClient.getWeather(latitude, longitude).enqueue(callback) und entfernen Sie den dritten Parameter.

+0

Es funktioniert wie ein Charme. Ich bin ziemlich neu mit Otto und RetroFit und alle Tutorials verwenden alte Versionen dieser Bibliotheken. –

+0

Die meisten Bibliotheken von square haben ziemlich gute Beispiele auf ihren Projektseiten, Sie sollten sie vor den Tutorials bei der Verwendung von Bibliotheken verwenden. – Kiskae

Verwandte Themen