1

firebase geofire 라이브러리를 사용하여 위치 기반의 키를 가져 오지만 키 기반 firebase를 가져올 때마다 onKeyEntered() 이벤트에서 수천 개의 키가 반환됩니다. 개체를 다시 가져 와서 listview가 매우 느리게 설정되도록하십시오. 나는 onKeyEntered()에서 다른 모든 작업에 대한 주석을 달아서 geofire가 얼마나 빠른지를 보았습니다. 900 밀리의 모든 콜백을 받았다는 것에 놀랐습니다.Firebase android 데이터를 가져 오는 방법 키 목록 일괄 처리

그래서 지금 항목의 목록보기 수천 빠른

I를로드해야합니다 위해 onKeyEntered() 콜백에 전달 된 키를 사용하여 중포 기지에서 데이터를 얻을 그래서 심지어 목록보기하도록 설정하는 가장 최적화 된 방법은 무엇인지 모든 콜백에서 AsyncTask를 생각하면 인출 데이터가 AsyncTask에 전달되고 다음 콜백 키로 진행되고 똑같이 수행되지만 올바른지는 확실하지 않습니다.

또는 몇 가지만로드 한 다음 스크롤을로드하는 것도 좋은 생각입니다.하지만 geofire는 데이터베이스 전체에서 키를 반환하므로 최신 정보를 얻을 수있는 옵션이 없어 구현 방법이 확실하지 않습니다.

이것은 내가 시도하지만 목록보기로드가 매우 느립니다. 악명 대답하기 어렵다 "최상의 방법"유형의

@Override 
public void onKeyEntered(String key, GeoLocation location) { 
    Log.d("geoevent", key); 
    mDatabaseTemp = FirebaseDatabase.getInstance().getReference("/posts/" + key); 
    mDatabaseTemp.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Post post = new Post(); 
      post = dataSnapshot.getValue(Post.class); 
      mPosts.add(post); 
      mPostAdapter.notifyDataSetChanged(); 
      mRecycler.smoothScrollToPosition(mPosts.size() - 1); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Toast.makeText(getActivity(), "error" + databaseError, Toast.LENGTH_LONG).show(); 

     } 
    }); 
} 
+0

아래에 몇 가지 힌트가 있지만 일반적으로이 질문은 너무 광범위합니다. 단일 질문으로 제한하십시오. "왜 아이템이 예상보다 빨리 돌아오고 있습니까?" (요청이 파이프 라인되어 있기 때문에) (http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of -obse/35932786 # 35932786) btw). –

답변

1

질문. 그러나 당신이 알지 못하는 시스템의 일반적인 행동에 대해 몇 가지 힌트를 드리겠습니다.

  1. Firebase 데이터베이스 클라이언트는 별도의 스레드에서 네트워크 및 디스크와 상호 작용합니다. 클라이언트에서 사용할 수있는 데이터는 메인/UI 스레드에서 핸들러를 호출합니다. 즉, AsyncTask에 전화를 걸면 콜백에서 중요한 작업을 수행하는 경우에만 유용합니다.
  2. Firebase 데이터베이스 클라이언트는 단일 연결을 통해 서버에 대한 호출을 파이프 라인합니다. 성능에 영향을 미치는 이유에 대한 자세한 내용은 Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly을 참조하십시오.
  3. 네트워크를 통해 수천 개의 항목을 모바일 장치에로드하는 것은 일반적으로 좋지 않습니다. 사용자에게 표시 할 데이터와 수천 개의 항목 만로드하면 모바일 화면에 합리적으로 표시 될 수있는 것 이상입니다. 위치 기반 앱을 개발할 때 사용자가 핫스팟을 표시하고 지리적 쿼리를 사용하여 해당 지점 주변의 항목 만 요청하는지도를 표시 할 수 있습니다.
+0

geofire 라이브러리에서 나는 모든 키를 즉각적으로 가져 오는 것을 좋아하지만, 일반적으로 모든 곳에서 특정 위치에 대한 데이터를 가져 오는 작업이 끝날 때마다 콜백이 필요합니다. –

+0

3 번째 포인트에서 최근 게시물은 거의 보이지 않지만 geofire 라이브러리는 x 위치에 저장된 모든 항목에 대한 콜백을 제공합니다. 그래서 x 위치에 사용할 수있는 게시물의 수천 경우 다음 모든 추가 콜백을 통해 갈 firebase를 참조하고 데이터를 가져올 키를 사용하여 게시 시간과 필터를 비교해야만 최근에 추가 된 게시물을 표시하도록 처음 저장된 항목에서 콜백을 제공합니다 따라서 실제로 모든 항목을 표시하는 것과 동일한 시간이 걸릴 것이므로 권장 방법을 제공 할 수 있다면 도움이 될 것입니다. 사전에 감사드립니다 –

+0

최근 항목 만 얻으려면 최근 항목에 대한 별도의 지리적 노드를 유지하는 것이 어떻습니까? 이렇게하면 클라이언트 측 필터링이 필요하지 않으므로 사용자의 대역폭 사용이 크게 줄어 듭니다. –

관련 문제