使用 Retrofit 时出错 [英] Error when using Retrofit

查看:64
本文介绍了使用 Retrofit 时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从 Web 服务器获取数据.我是 Retrofit 的新手,并且出现错误 No Retrofit annotation found (parameter#1)"尝试启动我的应用时,我不明白是什么导致了这个错误以及如何处理.

VideoApi 类:

公共接口 VideoApi {@GET("/视频/精选")通话<视频>getFeaturedVideo(Callback> response);}

视频类:

公共类视频{私人字符串网址,标题,描述;私人整数分数;公共字符串 getUrl() {返回网址;}公共无效setUrl(字符串网址){this.url = url;}公共字符串 getTitle() {返回标题;}公共无效设置标题(字符串标题){this.title = 标题;}公共字符串 getDescription() {退货说明;}public void setDescription(字符串描述){this.description = 描述;}公共 int getScore() {返回分数;}public void setScore(int score) {this.score = 分数;}}

片段类:

 public class FeaturedFragment extends Fragment {public static final String ROOT_URL = "https://api.vid.me";私人列表<视频>视频;RecyclerView recList;公共视图 onCreateView(LayoutInflater inflater, ViewGroup 容器,捆绑savedInstanceState) {查看 rootView = inflater.inflate(R.layout.fragment_featured, container, false);recList = (RecyclerView) rootView.findViewById(R.id.cardList);recList.setHasFixedSize(true);LinearLayoutManager llm = new LinearLayoutManager(getActivity());llm.setOrientation(LinearLayoutManager.VERTICAL);recList.setLayoutManager(llm);返回根视图;}public void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);尝试 {获取视频();} catch (IOException e) {e.printStackTrace();}}private void getVideos() 抛出 IOException {Retrofit retrofitAdapter = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(ROOT_URL).建造();VideoApi videoApi = retrofitAdapter.create(VideoApi.class);在这一行中//videoApi.getFeaturedVideo(new Callback>() {@覆盖public void onResponse(Call> call, Response> response) {视频.addAll(response.body());RecyclerViewAdapter reciclerViewAdapter = new RecyclerViewAdapter(videos);recList.setAdapter(reciclerViewAdapter);}@覆盖public void onFailure(Call> call, Throwable t) {}});}}

我的日志:

04-21 17:40:56.851 636-662/?E/EmbeddedLogger:应用程序崩溃!进程:com.example.vid_me_app04-21 17:40:56.851 636-662/?E/EmbeddedLogger:应用程序崩溃!包:com.example.vid_me_app v1 (1.0)04-21 17:40:56.851 636-662/?E/EmbeddedLogger:应用标签:Vid_me_app04-21 17:40:56.851 24066-24066/com.example.vid_me_app E/AndroidRuntime:致命异常:主要 java.lang.IllegalArgumentException:未找到 Retrofit 注释.(参数#1)用于方法 VideoApi.getFeaturedVideo在改造2.ServiceMethod$Builder.methodError(ServiceMethod.java:695)在改造2.ServiceMethod$Builder.methodError(ServiceMethod.java:686)在retrofit2.ServiceMethod$Builder.parameterError(ServiceMethod.java:704)在retrofit2.ServiceMethod$Builder.parseParameter(ServiceMethod.java:343)在改造2.ServiceMethod$Builder.build(ServiceMethod.java:201)在retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166)在retrofit2.Retrofit$1.invoke(Retrofit.java:145)在 $Proxy1.getFeaturedVideo(本机方法)在 com.example.vid_me_app.FeaturedFragment.getVideos(FeaturedFragment.java:60)在 com.example.vid_me_app.FeaturedFragment.onActivityCreated(FeaturedFragment.java:47)在 android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1983)在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1092)在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)在 android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)在 android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)在 android.support.v4.view.ViewPager.populate(ViewPager.java:1177)在 android.support.v4.view.ViewPager.populate(ViewPager.java:1025)在 android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1545)在 android.view.View.measure(View.java:15696)在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)在 android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:668)在 android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:735)在 android.view.View.measure(View.java:15696)在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310)在 android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)在 android.view.View.measure(View.java:15696)在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)在 android.widget.LinearLayout.measureVertical(LinearLayout.java:695)在 android.widget.LinearLayout.onMeasure(LinearLayout.java:588)在 android.view.View.measure(View.java:15696)在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310)在 android.view.View.measure(View.java:15696)在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)在 android.widget.LinearLayout.measureVertical(LinearLayout.java:695)在 android.widget.LinearLayout.onMeasure(LinearLayout.java:588)在 android.view.View.measure(View.java:15696)在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310)在 com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2261)在 android.view.View.measure(View.java:15696)在 android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2225)在 android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1290)在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1527)在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1190)在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4860)在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:766)在 android.view.Choreographer.doCallbacks(Choreographer.java:575)在 android.view.Choreographer.doFrame(Choreographer.java:542)在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:751)在 android.os.Handler.han

解决方案

你必须像这样使用 videoApi.getFeaturedVideo(new Callback>() 方法:

Call>call=videoApi.getFeaturedVideo();call.enqueue(new Callback>() {@覆盖public void onResponse(Call> call, Response> response) {}@覆盖public void onFailure(Call> call, Throwable t) {}});

还有你的 api :

公共接口 VideoApi {@GET("/视频/精选")调用<列表<视频>>getFeaturedVideo();}

<块引用>

如果你有错误也试试这个:

import javax.annotation.Generated;导入 com.google.gson.annotations.Expose;导入 com.google.gson.annotations.SerializedName;@Generated("org.jsonschema2pojo")公开课视频{@SerializedName("url")@暴露私人字符串网址;@SerializedName("标题")@暴露私人字符串标题;@SerializedName("描述")@暴露私人字符串描述;@SerializedName("分数")@暴露私人整数分数;/**** @返回* 网址*/公共字符串 getUrl() {返回网址;}/**** @param url* 网址*/公共无效setUrl(字符串网址){this.url = url;}/**** @返回* 标题*/公共字符串 getTitle() {返回标题;}/**** @param 标题* 标题*/公共无效设置标题(字符串标题){this.title = 标题;}/**** @返回* 说明*/公共字符串 getDescription() {退货说明;}/**** @param 描述* 说明*/public void setDescription(字符串描述){this.description = 描述;}/**** @返回* 分数*/公共整数 getScore() {返回分数;}/**** @param 分数* 分数*/公共无效setScore(整数分数){this.score = 分数;}}

确保您已将此添加到您的 gradle

编译'com.google.code.gson:gson:2.4'

试试这个站点来创建你的 POJO 类:Json Schema to POJO

I'm trying to get data from web server.I'n new with Retrofit ,and I have error "No Retrofit annotation found (parameter#1)" when try launch my app,I dont understand what cause this error and what to do with that.

VideoApi class:

public interface VideoApi {

    @GET("/videos/featured")
    Call<Video>  getFeaturedVideo(Callback<List<Video>> response);
}

Video class:

public class Video {
    private  String url,title,description;
    private  int score;
    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }


}

FragmentClass:

    public class FeaturedFragment extends Fragment {
        public static final String ROOT_URL = "https://api.vid.me";
        private List <Video> videos;
        RecyclerView recList;

        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_featured, container, false);
            recList = (RecyclerView) rootView.findViewById(R.id.cardList);
            recList.setHasFixedSize(true);
            LinearLayoutManager llm = new LinearLayoutManager(getActivity());
            llm.setOrientation(LinearLayoutManager.VERTICAL);
            recList.setLayoutManager(llm);
            return rootView;
        }

        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            try {
                getVideos();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        private void getVideos() throws IOException {

            Retrofit retrofitAdapter = new Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
                    .baseUrl(ROOT_URL)
                    .build();
            VideoApi videoApi = retrofitAdapter.create(VideoApi.class);
   In this line// videoApi.getFeaturedVideo(new Callback<List<Video>>() {
        @Override
        public void onResponse(Call<List<Video>> call, Response<List<Video>> response) {
            videos.addAll(response.body());
            RecyclerViewAdapter reciclerViewAdapter = new RecyclerViewAdapter(videos);
            recList.setAdapter(reciclerViewAdapter);
        }

        @Override
        public void onFailure(Call<List<Video>> call, Throwable t) {

        }
    });

        }
    }

My logcat:

04-21 17:40:56.851 636-662/? E/EmbeddedLogger: App crashed! Process: com.example.vid_me_app
04-21 17:40:56.851 636-662/? E/EmbeddedLogger: App crashed! Package: com.example.vid_me_app v1 (1.0)
04-21 17:40:56.851 636-662/? E/EmbeddedLogger: Application Label: Vid_me_app
04-21 17:40:56.851 24066-24066/com.example.vid_me_app E/AndroidRuntime: 
FATAL EXCEPTION: main java.lang.IllegalArgumentException: 
No Retrofit annotation found. (parameter #1) for method VideoApi.getFeaturedVideo
at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:695)
at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:686)
at retrofit2.ServiceMethod$Builder.parameterError(ServiceMethod.java:704)
at retrofit2.ServiceMethod$Builder.parseParameter(ServiceMethod.java:343)
at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:201)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166)
at retrofit2.Retrofit$1.invoke(Retrofit.java:145)
at $Proxy1.getFeaturedVideo(Native Method)
at com.example.vid_me_app.FeaturedFragment.getVideos(FeaturedFragment.java:60)
at com.example.vid_me_app.FeaturedFragment.onActivityCreated(FeaturedFragment.java:47)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1983)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1092)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1177)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1025)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1545)
at android.view.View.measure(View.java:15696)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:668)
at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:735)
at android.view.View.measure(View.java:15696)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:15696)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:15696)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15696)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:15696)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2261)
at android.view.View.measure(View.java:15696)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2225)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1290)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1527)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1190)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4860)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:766)
at android.view.Choreographer.doCallbacks(Choreographer.java:575)
at android.view.Choreographer.doFrame(Choreographer.java:542)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:751)
at android.os.Handler.han

解决方案

You must use videoApi.getFeaturedVideo(new Callback<List<Video>>() method like that :

Call<List<Video>> call=videoApi.getFeaturedVideo();
call.enqueue(new Callback<List<Video>>() {
            @Override
            public void onResponse(Call<List<Video>> call, Response<List<Video>> response) {


            }

            @Override
            public void onFailure(Call<List<Video>> call, Throwable t) {

            }
        });

And your api :

public interface VideoApi {

    @GET("/videos/featured")
    Call<List<Video>>getFeaturedVideo();
}

Still if you have errors try this too :

import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("org.jsonschema2pojo")
public class Video {

@SerializedName("url")
@Expose
private String url;
@SerializedName("title")
@Expose
private String title;
@SerializedName("description")
@Expose
private String description;
@SerializedName("score")
@Expose
private Integer score;

/**
* 
* @return
* The url
*/
public String getUrl() {
return url;
}

/**
* 
* @param url
* The url
*/
public void setUrl(String url) {
this.url = url;
}

/**
* 
* @return
* The title
*/
public String getTitle() {
return title;
}

/**
* 
* @param title
* The title
*/
public void setTitle(String title) {
this.title = title;
}

/**
* 
* @return
* The description
*/
public String getDescription() {
return description;
}

/**
* 
* @param description
* The description
*/
public void setDescription(String description) {
this.description = description;
}

/**
* 
* @return
* The score
*/
public Integer getScore() {
return score;
}

/**
* 
* @param score
* The score
*/
public void setScore(Integer score) {
this.score = score;
}

}

Make sure u have added this to your gradle

compile 'com.google.code.gson:gson:2.4'

And try this site to create your POJO class :Json Schema to POJO

这篇关于使用 Retrofit 时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆