2016-11-22 6 views
1

Я пытаюсь использовать Retrofit и OkHttp для запроса на сервер. У меня есть следующий класс «AutomaticRequest.java», у которого есть запрос на получение видео с сервера.Как подождать, пока у Callback есть данные?

public class AutomaticRequest { 

    public void getVideos(final AutomaticCallback callback){ 

     MediaproApiInterface service = ApiClient.getClient(); 
     Call<List<AutomaticVideo>> call = service.getAllVideos(); 
     call.enqueue(new Callback<List<AutomaticVideo>>() { 

      @Override 
      public void onResponse(Call<List<AutomaticVideo>> call, Response<List<AutomaticVideo>> response) { 
       List<AutomaticVideo> automaticVideoList = response.body(); 
       callback.onSuccessGettingVideos(automaticVideoList); 

      } 

      @Override 
      public void onFailure(Call<List<AutomaticVideo>> call, Throwable t) { 
       callback.onError(); 
      } 
     }); 

    } 
} 

Я создал следующий класс «AutomaticCallback.java» для извлечения данных.

public interface AutomaticCallback { 
    void onSuccessGettingVideos(List<AutomaticVideo> automaticVideoList); 
    void onError(); 
} 

Я звоню запрос от фрагмента, как следующий способ:

public class AllVideosFragment extends Fragment { 

    ... 
    AutomaticCallback callback; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_allvideos, container, false); 

     new AutomaticRequest().getVideos(callback); 

     return view; 
    } 

    ... 

} 

Как я могу подождать, пока обратный вызов не имеет данных для обновления пользовательского интерфейса ?? Спасибо.

+0

синхронный запрос будет автоматически ждать ответа, но он не будет блокировать основной поток до тех пор. Вы должны сделать асинхронный запрос и, получив ответ, обновите UI. – nandsito

ответ

2

Просто реализовать интерфейс AutomaticCallback на вашем фрагменте, как:

public class AllVideosFragment extends Fragment implements AutomaticCallback { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_allvideos, container, false); 

     new AutomaticRequest().getVideos(this); 

     return view; 
    } 

    @Override 
    void onSuccessGettingVideos(List<AutomaticVideo> automaticVideoList){ 
     // use your data here 
    } 

    @Override 
    void onError(){ 
     // handle the error 
    } 
} 
+0

. Какой идиот я. Спасибо за это. – MAOL

+0

Мне нужно передать обратный вызов методу getVideos, чтобы сделать это? – MAOL

+0

Да, и поскольку ваш фрагмент реализует обратный вызов, вы передаете фрагмент методу aka 'this'. –