【问题标题】:How to get response from other thread using Retrofit 2.0如何使用 Retrofit 2.0 从其他线程获得响应
【发布时间】:2016-07-15 07:50:33
【问题描述】:

我使用改造 2 来获取 JSON Array,我想创建新的 ManagerListAdapter(它是 RecyclerView 的适配器)并在构造函数中传递 ArrayList(我从 JSON 获得)。

目前我在onResponse 中成功获得了此列表。 但这是另一个线程。

将它转移到主线程的最佳方法是什么? 也许我需要使用 RxJava 和 RxAndroid?

 private void initRecyclerView() {
        RecyclerView managersRecyclerView = (RecyclerView) view.findViewById(R.id.managersRecyclerView);
        managersRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        managersRecyclerView.setAdapter(new ManagerListAdapter(getManagers()));




//        getRemoteManagers();


    }

private void getRemoteManagers() {

    ApiObject client = ServiceGenerator.createService(ApiObject.class);
    Call<List<ManagerDTO>> call = client.getManagers();


    call.enqueue(new Callback<List<ManagerDTO>>() {
        @Override
        public void onResponse(Call<List<ManagerDTO>> call, Response<List<ManagerDTO>> response) {


            if (response.isSuccessful()) {

                List<ManagerDTO> managers = response.body(); //I want to  add this List in RecyclerAdapter
                sortManagers(managers);

            }

        }

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

        }
    });


}


private List<ManagerDTO> getManagers() {

//It's for test. 

    List<ManagerDTO> managers = new ArrayList<>();

    managers.add(new ManagerDTO("Alex Pavlov", 100));
    managers.add(new ManagerDTO("Ivan Pavlov", 95));
    managers.add(new ManagerDTO("Petr Pavlov", 99));
    managers.add(new ManagerDTO("Stepan Pavlov", 100));
    managers.add(new ManagerDTO("Azik Pavlov", 100));
    managers.add(new ManagerDTO("Azik Myand", 100));
    managers.add(new ManagerDTO("Azik Specca", 50));
    managers.add(new ManagerDTO("Azik Kane", 0));
    managers.add(new ManagerDTO("Azik McDonald", 99));
    managers.add(new ManagerDTO("Azik Jagr", 1));

    sortManagers(managers);

    return managers;


}

【问题讨论】:

  • 是的,RxJava 将是一个完美的选择,因为 Retrofit 在库本身中提供了 RxJava 支持。 AsyncTask 也可以用作替代方案。

标签: java android json multithreading retrofit


【解决方案1】:

我们可以将RxJavaRxAndroidRetrifit2 一起使用。

服务生成器:

private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()))
                    .baseUrl(Const.URL.UrlService)
                    .addConverterFactory(JacksonConverterFactory.create());


   public static <S> S createService(Class<S> serviceClass) {

        Retrofit retrofit = builder.build();
        return retrofit.create(serviceClass);
    }
}

请求:

ApiObject service = ServiceGenerator.createService(ApiObject.class);
        Observable<List<ManagerDTO>> observManagers = service.getManagers();
        observManagers
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<List<ManagerDTO>>() {
                    @Override
                    public void onCompleted() {
                        //do nothing
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("OnError", e.getMessage());
                        Toast.makeText(context, R.string.toast_connection_false, Toast.LENGTH_SHORT).show();
                        initRecyclerView(Cache.getManagers());
                        managersSwipe.setRefreshing(false);
                    }

                    @Override
                    public void onNext(List<ManagerDTO> managers) {
                        Log.e("OnNext", "Connect is OK");
                        sortManagers(managers);
                        Cache.setManagerDTO(managers);
                        initRecyclerView(managers);
                        managersSwipe.setRefreshing(false);

                        //Copy to db
                        RealmHelper helper = new RealmHelper(context);
                        helper.copyToRealmOrUpdate(managers);
                        Log.e("RealmCopy", "it's ok");
                    }
                });
    }

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2016-02-25
    • 2021-10-19
    • 2016-09-02
    • 2019-03-13
    • 2015-02-10
    相关资源
    最近更新 更多