Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public Single<SearchMovieResponse> searchMovies(Map<String, String> request) {

return RetrofitClient.getClient().create(MovieApi.class)
.searchMovies(request)
.subscribeOn(Schedulers.newThread());
.subscribeOn(Schedulers.io());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import android.databinding.BindingAdapter;
import android.widget.ImageView;

import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.example.yeseul.movieapp.R;

public class GlideUtil {
Expand All @@ -20,7 +22,12 @@ public static void loadImageCenterCrop(ImageView imageView, String url){

if (url == null) return;

GlideApp.with(imageView).load(url).placeholder(R.drawable.img_boostcamp).centerCrop().into(imageView);
GlideApp.with(imageView).load(url)
.placeholder(R.drawable.img_boostcamp)
.centerCrop()
.transition(DrawableTransitionOptions.withCrossFade())
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.into(imageView);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,24 @@ protected void onCreate(Bundle savedInstanceState) {

private void initView() {

LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

// recyclerView 생성
binding.recyclerMovie.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
binding.recyclerMovie.setLayoutManager(layoutManager);
binding.recyclerMovie.setAdapter(adapter);
binding.recyclerMovie.setEmptyView(binding.emptyView);
binding.recyclerMovie.setNestedScrollingEnabled(false);
binding.recyclerMovie.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

// 최하단 스크롤 감지
binding.recyclerMovie.setOnScrollListener(new RecyclerView.OnScrollListener(){
binding.recyclerMovie.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(!binding.recyclerMovie.canScrollVertically(1)){

int lastVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition();

if(adapter.getItemCount() <= lastVisiblePosition+5) {
presenter.loadItems(false);
}
}
Expand Down Expand Up @@ -118,4 +123,18 @@ public void startMovieDetailPage(String linkUrl) {

customTabsIntent.launchUrl(this, Uri.parse(linkUrl));
}

@Override
protected void onStop() {
super.onStop();

presenter.clearDisposables();
}

@Override
protected void onDestroy() {
super.onDestroy();

presenter.disposeDisposables(); //Presenter의 메소드 호출.
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.List;

import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;

public class MainPresenter implements MainContract.Presenter {

Expand All @@ -23,10 +24,12 @@ public class MainPresenter implements MainContract.Presenter {
private AdapterContract.Model<Movie> adapterModel;

private String searchKey = ""; // 검색 키워드
private final int PAGE_UNIT = 20; // 한번에 가져올 데이터 개수
private final int PAGE_UNIT = 15; // 한번에 가져올 데이터 개수
private int currentPage = 0; // 현재 페이지 index
private boolean isEndOfPage = false; // 페이지 끝 flag

private CompositeDisposable disposables = new CompositeDisposable();

public MainPresenter(MainContract.View view, MovieRepository repository) {
this.view = view;
this.repository = repository;
Expand Down Expand Up @@ -76,39 +79,56 @@ private void getMovieList(){

isLoading.set(true);

repository.searchMovies(MovieMapper.toRequest(searchKey, PAGE_UNIT, (PAGE_UNIT * currentPage++) + 1))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> {

// 로딩 flag OFF
isLoading.set(false);

List<Movie> movieList = response.getMovieList();

if(movieList.size() == 0){ // 검색 결과가 없는 경우
// 페이지 끝 flag ON
isEndOfPage = true;
// 뷰에 알리기
view.onSearchResultEmpty(searchKey);
return;
}

if ((PAGE_UNIT * currentPage) >= response.getTotal() || movieList.size() < PAGE_UNIT) { // 마지막 페이지거나 검색 결과가 10개 미만
// 페이지 끝 flag ON
isEndOfPage = true;
}

// 어댑터에 리스트 추가
adapterModel.addItems(movieList);
disposables.add(

@GODueol GODueol Jan 19, 2019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Single<SearchMovieResponse> searchMovies(@QueryMap Map<String, String> map);
API의 호출부가 Single클래스로 호출되고 있습니다
보통 Single 클레스로 호출하면 한번의 Stream이 흐르고 나면 완료됨을 명시해주는 클래스로
onNext와 onComplete가 같이 이루어 진다고 알고 있는데 명시적인 Dispose를 해주어야 하나요?

repository.searchMovies(MovieMapper.toRequest(searchKey, PAGE_UNIT, (PAGE_UNIT * currentPage++) + 1))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> {

// 로딩 flag OFF
isLoading.set(false);

List<Movie> movieList = response.getMovieList();

if (movieList.size() == 0) { // 검색 결과가 없는 경우
// 페이지 끝 flag ON
isEndOfPage = true;
// 뷰에 알리기
view.onSearchResultEmpty(searchKey);
return;
}

if ((PAGE_UNIT * currentPage) >= response.getTotal() || movieList.size() < PAGE_UNIT) { // 마지막 페이지거나 검색 결과가 10개 미만
// 페이지 끝 flag ON
isEndOfPage = true;
}

// 어댑터에 리스트 추가
adapterModel.addItems(movieList);

}, error -> {

// 로딩 flag OFF
isLoading.set(false);
// 페이지 끝 flag ON
isEndOfPage = true;
// 뷰에 알리기
view.onSearchResultEmpty(searchKey);
}));
}

}, error -> {
/**
* CompositeDisposable 을 clear .
*/
public void clearDisposables() {
disposables.clear();
}

// 로딩 flag OFF
isLoading.set(false);
// 페이지 끝 flag ON
isEndOfPage = true;
// 뷰에 알리기
view.onSearchResultEmpty(searchKey);
});
/**
* CompositeDisposable 을 dispose .
*/
public void disposeDisposables() {
if (!disposables.isDisposed()) {
disposables.dispose();
}
}
}