2016-07-15 2 views
2

Я использую переоснащение 2, чтобы получить JSON Array, и я хочу, чтобы создать новый ManagerListAdapter (Это адаптер для RecyclerView) и передать ArrayList (который я получил от JSON) в конструкторе.Как получить ответ от другого потока с помощью Дооснащения 2.0

На данный момент я успешно получил этот список в 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; 


} 
+0

Да RxJava будет идеальным выбором, поскольку дооснащения обеспечивает поддержку RxJava в самой библиотеке. AsyncTask также может использоваться как альтернатива. –

ответ

0

Мы можем использовать RxJava и RxAndroidRetrifit2 с.

ServiceGenerator:

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"); 
        } 
       }); 
    } 
Смежные вопросы