IllegalArgumentException:仅支持接口端点定义

IllegalArgumentException: Only Interface endpoint definitions are supported

显然,我错误地实施了 getApi and/or getActiveListing 方法以从 Etsy.

检索内容

Etsy.java

import com.joshbgold.recommendations.model.ActiveListings;

import retrofit.Callback;
import retrofit.RequestInterceptor;
import retrofit.RestAdapter;

public class Etsy {
    private static final String API_KEY = "juj938tmfk0nq9zrzc6mhsav";

    private static RequestInterceptor getInterceptor() {
        return new RequestInterceptor(){
            @Override
            public void intercept(RequestInterceptor.RequestFacade request){
                request.addEncodedQueryParam("api_key", API_KEY);
            }

        };
    }

    private static Api getApi(){
        return new RestAdapter.Builder()
                .setEndpoint("https://openapi.etsy.com/v2")
                .setRequestInterceptor(getInterceptor())
                .build()
                .create(Api.class);
    }

    public static void getActiveListings(Callback<ActiveListings> callback){
        getApi().activeListings("Images, Shop", callback);
    }
}

MainActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import com.joshbgold.recommendations.API.Etsy;
import com.joshbgold.recommendations.model.ActiveListings;

public class MainActivity extends AppCompatActivity {

    private static final String STATE_ACTIVE_LISTINGS = "StateActiveListings";

    private RecyclerView recyclerView;
    private View progressBar;
    private TextView errorView;

    private ListingAdapter adapter;

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

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        progressBar = (findViewById(R.id.progressbar));
        errorView = (TextView) findViewById(R.id.error_view);

        //setup recyclerview
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));

        adapter = new ListingAdapter(this);

        recyclerView.setAdapter(adapter);

        if(savedInstanceState == null){
            showLoading();
            Etsy.getActiveListings(adapter);
        }
        else {
            if(savedInstanceState.containsKey(STATE_ACTIVE_LISTINGS)) {
                adapter.success((ActiveListings) savedInstanceState.getParcelable(STATE_ACTIVE_LISTINGS), null);
                showList();
            } else{
                showLoading();
                Etsy.getActiveListings(adapter);
            }
        }

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        ActiveListings activeListings = adapter.getActiveListings();
        if(activeListings != null){
            outState.putParcelable(STATE_ACTIVE_LISTINGS, activeListings);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void showLoading(){
        progressBar.setVisibility(View.VISIBLE);
        recyclerView.setVisibility(View.GONE);
        errorView.setVisibility(View.GONE);
    }

    public void showList(){
        progressBar.setVisibility(View.GONE);
        recyclerView.setVisibility(View.VISIBLE);
        errorView.setVisibility(View.GONE);
    }

    public void showError(){
        progressBar.setVisibility(View.GONE);
        recyclerView.setVisibility(View.GONE);
        errorView.setVisibility(View.VISIBLE);
    }
}

Api.java

import com.joshbgold.recommendations.model.ActiveListings;

import retrofit.Callback;
import retrofit.http.GET;
import retrofit.http.Query;

public class Api {

    @GET("/listings/active")
    void activeListings(@Query("includes") String includes,
                        Callback<ActiveListings> callback) {

    }
}

Logcat:

09-11 11:49:39.234  11172-11172/? I/art﹕ Late-enabling -Xcheck:jni
09-11 11:49:39.414  11172-11172/com.joshbgold.recommendations D/AndroidRuntime﹕ Shutting down VM
    --------- beginning of crash
09-11 11:49:39.416  11172-11172/com.joshbgold.recommendations E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.joshbgold.recommendations, PID: 11172
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.joshbgold.recommendations/com.joshbgold.recommendations.MainActivity}: java.lang.IllegalArgumentException: Only interface endpoint definitions are supported.
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access0(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     **Caused by: java.lang.IllegalArgumentException: Only interface endpoint definitions are supported.
            at retrofit.Utils.validateServiceClass(Utils.java:102)
            at retrofit.RestAdapter.create(RestAdapter.java:193)
            at com.joshbgold.recommendations.API.Etsy.getApi(Etsy.java:30)
            at com.joshbgold.recommendations.API.Etsy.getActiveListings(Etsy.java:34)
            at com.joshbgold.recommendations.MainActivity.onCreate(MainActivity.java:43)**
            at android.app.Activity.performCreate(Activity.java:5990)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access0(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-11 11:51:32.053  11172-11184/com.joshbgold.recommendations W/art﹕ Suspending all threads took: 13.000ms
09-11 11:54:39.464  11172-11172/com.joshbgold.recommendations I/Process﹕ Sending signal. PID: 11172 SIG: 9

您没有 post 您的 Api 类型定义(.create(Api.class); 引用的类型)的源代码。我从错误消息中猜测它被定义为 public class Api { ... }。应该定义为public interface Api { ... }.