마스터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 포인트) 님이 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 (42,940 포인트) 님이 4월 6일 답변
초보입니당님이 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 등을 사용할 때도 있습니다.
친절한 답변 정말 감사합니다.
많은 도움이 됐습니다~!
...