2017-12-19 6 views
-1

tablayout의 탭을 전환하는 동안 성능 문제가 있습니다. 시나리오 1에서는 레코드 수가 적어서 탭 사이를 쉽게 전환 할 수 있으며 사용자는 어떤 지연도하지 않습니다. 내가 더 많은 데이터를 가지고있을 때 사용자는 아래 스크린 샷과 같이 지연을 느낄 수 있습니다. 몇 초가 지나면 화면이로드되지만 사용자에게는 매우 눈에.니다. 누군가가 이것을 개선하기 위해 점검 할 수있는 영역을 제안 할 수 있습니까? 다음은 문제와 현재의 조각 코드는 ...전환 탭 지연 android tablayout

UI -

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_profile, container, false); 
    dbConnection = new databaseHelper(getContext()); 
    dbConnection.getWritableDatabase(); 
    profileFragment = view.findViewById(R.id.profileFragment); 
    downloadData = profileFragment.findViewById(R.id.dwnldData); 
    refresh = profileFragment.findViewById(R.id.refreshdata); 
    search = profileFragment.findViewById(R.id.search); 
    removeFilter= profileFragment.findViewById(R.id.removeFilter); 
    viewPager = (ViewPager) getActivity().findViewById(R.id.viewpager); 
    currmelas = dbConnection.findMelas("YES","YES",""); 

    downloadData.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      viewPager.setCurrentItem(0); 
     } 
    }); 



    if (viewPager.getCurrentItem()==1){ 
     candidateData = dbConnection.findHighCandData(mela_id,"1",""); 
    } else { 
     candidateData = dbConnection.findHighCandData(mela_id,"",""); 
    } 


    if (candidateData.size() <= 0) { 
     if (currmelas.size() == 0){ 
      downloadData.setVisibility(View.VISIBLE); 
      Handler handler = new Handler(); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        if(userSettings.size()==0){ 
         viewPager.setCurrentItem(3); 
        } else { 
         viewPager.setCurrentItem(0); 
        } 
       } 
      }); 

     } 
    } else {    

     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         setScrollView(candidateData); 
        } 
       }); 
      } 
     }, 100); 

    } 
    return view; 
} 
+0

왜 이것이 투표에 실패했는지 나는 잘 모르겠다. – Akshay

답변

1
배경 노동자에 데이터로드를 이동

및 UI 스레드에 대한 정보를로드하지 않습니다. 이렇게하면 탭 전환간에 콘텐츠를 가져 오는 동안 지연되지 않습니다. 나는 똑같은 문제가 있었고 모든 데이터로드를 별도의 스레드로 옮겨서 깨끗하고 부드러운 UI를 구현해야했습니다. 로드 된 후 각 스 와이프에서 다시로드하지 않도록 중요한 항목을 유지하려면 캐시 된 페이지 수를 화면 한도로 설정해야합니다. here

+0

빠른 응답을 주셔서 감사합니다. 나는 제안한 옵션을 시도했습니다. 약간의 개선이 있었지만 사용자에게는 여전히 눈에.니다. – Akshay

+0

메시지를 게시 한 후에 나는 그것을 향상시키기위한 또 다른 해결 방법을 깨닫고 효과가있었습니다. 제안에 감사드립니다. – Akshay

+0

로더를 사용하여 언급 한 @ 7toes.fablwesh는 걱정할 필요가 없습니다.이 방법은 매우 최적화 된 방법이지만, 처음 배우는 데는 약간의 시간이 걸릴 수 있습니다. 나는 백그라운드 작업을 API에 사용하여 콘텐츠 및 Recycler Views를 onBindView와 함께 끌어 와서 깨끗하게 유지한다고 가정했지만, 로컬 데이터를 사용하거나 asyncTaskLoaders를 배우는 데 어려움이 있다면 https ://developer.android.com/reference/android/content/AsyncTaskLoader.html – Sam

0

대한 추가 정보는 그냥 다른 사람에게 도움이 될 것입니다, 그래서 내 솔루션을 공유하고 싶었다. 내 코드에서 루프에 프로파일을로드하고 있었는데, 약 200 개의 프로파일이있을 때마다로드하는 데 시간이 걸리고 사용자는 지연을 볼 수 있습니다. @Sam 언급 한 바와 같이 내가 아래의 코드에서 코드를 이동하고 내 문제를 해결했습니다. 이제 시스템은 탭을 즉시 보여 주며 데이터는 이전 래그보다 나은 몇 초 후에로드됩니다.

new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          setScrollView(candidateData); 
         } 
        }); 
       } 
      }, 100);