마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

처음 앱 켰을 때 서버에서 데이터 불러오는법??

0 추천

안녕하세요.

앱 만들어보고 있는 초보 개발자인데요

앱을 처음 켰을때 홈 화면에 서버의 데이터를 바로 받아오고 싶은데

로드가 바로 안되고 한 번 클릭을 해야 로드가 되는데 어떻게 해야할까요?

app-Fastfood/DataBase.java at sangyeon · sangyeon-shin/app-Fastfood · GitHub DB부분

app-Fastfood/CustomerAdapter.java at sangyeon · sangyeon-shin/app-Fastfood · GitHub Adapter부분

app-Fastfood/TabFragment_0.java at sangyeon · sangyeon-shin/app-Fastfood · GitHub fragment 부분

초보입니당 (300 포인트) 님이 2021년 4월 5일 질문

1개의 답변

0 추천
 
채택된 답변

RxJava를 쓰실 때 subscribe하는 부분이 좀 이상한데요. Database클래스가 아니라 Fragment에 subscribe를 하셔야할 것 같은데요.

public void getList(int category_num): Single<Your_return_type>{
        Retrofit retrofit = new Retrofit.Builder().addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create()).baseUrl("http://13.58.187.197:8080").build();

        DBService service = retrofit.create(DBService.class);

        service.getCompanyinfo(category_num).subscribeOn(Schedulers.io());
}


getList(1).observeOn(AndroidSchedulers.mainThread())
    .subscribe(
                v ->updateList(v.subList(0,v.size())),
                err -> System.err.println("onError() : err :" + err.getMessage()));

    }

그리고  disposable 을 메모리에서 클리어하시는 부분도 체크해 보세요. Memory leak이 의심되네요.

spark (224,800 포인트) 님이 2021년 4월 6일 답변
초보입니당님이 2021년 4월 7일 채택됨
Database 클래스를 다른 프래그먼트에서도 사용하려고 클래스를 나눴는데 별로인가요?
그리고 답변해주신 : Single<Your_return_type> 이 부분이 이해가 되지 않습니다ㅜ
v ->updateList(v.subList(0,v.size())) 이 부분의 updateList는 제가 메소드 만들어야하는건가요?
데이터 처리하는 부분을 별도의 클래스로 만드는 건 좋은 방법인데, 제가 말씀드린 것은 RxJava 의 사용법입니다.
Observable/Single.subscribeOn(Schedulers.io()) 의 의미는 background thread를 통해 작업을 하겠다는 의미이고 .observeOn(AndroidSchedulers.mainThread())이 의미하는 바는 UI 관련된 작업을 메인쓰레드를 통해서 하겠다는 것입니다.
RxJava는 비동기 처리를 하기 때문에 님이 구현한 Database.getList() 메소드로는 언제 데이터가 들어오는지 알 수가 없습니다. 따라서
 Database db = new Database();
        db.getList(1);
        if(db.list != null) {
            //어댑터 업데이트 코드 생략
        }

위처럼 사용하게 될 경우 db.getList(1)가 호출되자 마자 if 블록이 실행이 되기 때문에, 거의 100% db.list는 아직 데이터가 세팅되지 않은 상태가 됩니다. 그런데 다시 같은 코드가 호출되면 이전에 db.list가 세팅이 된 상태이기 때문에  어댑터에 반영이 되겠죠. 따라서 RxJava를 사용하여 백그라운드 처리를 하고 이걸 메인쓰레드쪽에 받아 처리하려면 .observeOn(AndroidSchedulers.mainThread()) 부분이 메인쓰레드가 있는 코드에서 실행이 되어야 겠죠. 님의 경우는 TabFragment_0이 메인쓰레드 부분에 해당하구요. 왜 메소드 이름이 observeOn인지 잠시 생각해 보시면 좋을 것 같습니다.
Single<T>는 RxJava에서 사용하는 리턴 타입 중의 하나입니다. T는 Generic 으로 님이 리턴할 클래스가 되구요. 상황에 따라서는 Single 외에 Observable, Flowable 등을 사용할 때도 있습니다.
친절한 답변 정말 감사합니다.
많은 도움이 됐습니다~!
...