简体   繁体   English

retofit2不调用onResponse或onFailure

[英]retofit2 doesn't call onResponse or onFailure

I make request in loadFriends() users names with method loadUserName() But nothing happens and second request ( loadUserName() ) triggered only for the first lane. 我使用方法loadUserName()在loadFriends()用户名中发出请求,但是什么也没有发生,第二个请求(loadUserName())仅针对第一个通道触发。 I have logs and code of this fragment Also, AS tell me, that List "names" is never assigned , but do not I fill it in the method loadUserNames()? 我有这个片段的日志和代码另外,请告诉我,列表“名称” 从未分配 ,但是我不将其填写到loadUserNames()方法中吗? And is this related with my issue (not calling onResponse and onFailure ?) Other methods and requests work fine 这与我的问题有关(不调用onResponse和onFailure吗?)其他方法和请求都可以正常工作

public class FriendsFragment extends Fragment {

private String sid;
private PenyokService friendsService;
private RecyclerView friendsRecyclerView;
private FriendsAdapter friendsAdapter;
private List<Integer> ids;
private List<String> names;

public FriendsFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    friendsRecyclerView = (RecyclerView) inflater.inflate(R.layout.fragment_stats, container, false);

    // view = getView();
    sid = ((MainActivity) getActivity()).getSid();
    friendsService = APIUtils.getPService();

    friendsRecyclerView = (RecyclerView) inflater.inflate(R.layout.fragment_stats, container, false);
    friendsAdapter = new FriendsAdapter(new ArrayList<Integer>(0), new ArrayList<String>(0), getActivity().getApplicationContext(), sid);
    friendsRecyclerView.setAdapter(friendsAdapter);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    friendsRecyclerView.setLayoutManager(layoutManager);
    loadFriends();

    return friendsRecyclerView;
}

private void loadFriends(){
    friendsService.getFriends(sid).enqueue(new Callback<Model>() {

        @Override
        public void onResponse(Call<Model> call, Response<Model> response) {
            if(response.isSuccessful()) {
                ids = response.body().getMyFriends();
                Log.d("testtest", "start load names");
                for (int i : ids)
                    Log.d("test", "loaded names " + i);
                loadUserName(ids);
                Log.d("testtest", "loaded names");
                friendsAdapter.updateFriends(response.body().getMyFriends(), names);
                // Toast.makeText(getActivity(), "Gav gav", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<Model> call, Throwable t) {
            //showErrorMessage();
            Log.d("testtest", t.toString());
            Toast.makeText(getActivity(), t.toString(), Toast.LENGTH_SHORT).show();
        }
    });
}

private void loadUserName(List<Integer> id) {
    Log.d("test", "loading names");
    for (int x : id) {
        Log.d("testtest", "after for " + x);
        friendsService.getUserName(x, sid).enqueue(new Callback<Model>() {

            @Override
            public void onResponse(Call<Model> call, Response<Model> response) {
                Log.d("testtest", "before response is successful");
                if (response.isSuccessful()) {
                    Log.d("testtest", "response is successful");
                    if (response.body().getNameFor() != null) {
                        names.add(response.body().getNameFor());
                        Log.d("testtest", "in onResponse");
                    }
                else {
                        names.add("Set your name");
                        Log.d("testtest", "we set name");
                    }
                }
            }

            @Override
            public void onFailure(Call<Model> call, Throwable t) {
                //showErrorMessage();
                Log.d("testtest", t.toString() + "loadUserName");
                // Toast.makeText(getActivity(), t.toString(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

} }

09-07 15:35:30.993 6238-6238/com.journaldev.navigationdrawer D/testtest: start load names
09-07 15:35:30.993 6238-6238/com.journaldev.navigationdrawer D/test: loaded names 1
09-07 15:35:30.993 6238-6238/com.journaldev.navigationdrawer D/test: loaded names 2
09-07 15:35:30.993 6238-6238/com.journaldev.navigationdrawer D/test: loaded names 4
09-07 15:35:30.993 6238-6238/com.journaldev.navigationdrawer D/test: loading names
09-07 15:35:30.993 6238-6238/com.journaldev.navigationdrawer D/testtest: after for 1
09-07 15:35:31.053 6238-6238/com.journaldev.navigationdrawer D/testtest: after for 2
09-07 15:35:31.063 6238-6238/com.journaldev.navigationdrawer D/testtest: after for 4
09-07 15:35:31.103 6238-6238/com.journaldev.navigationdrawer D/testtest: loaded names

Code after retrofit requests is starting very quickly. 改装请求后的代码启动非常迅速。 It starts faster than the response from the server comes Solution - think about the structure of calling methods (get full response --> start next method) 它的启动速度快于来自服务器的响应解决方案-考虑调用方法的结构(获取完整的响应->启动下一个方法)

我们从未创建过names变量,我们没有创建列表的实例。如果您尝试向列表中添加任何当前为null的内容,则会导致NullPointerException 。我建议将列表初始化为

private List<String> names=new ArrayList<>();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM