2017-09-09 4 views
0

J'ai la disposition des onglets avec 5 onglets chacun a des fragments séparés, le premier fragment affiche flux RSS Nouvelles qui sont récupérées du serveur, ce fragment de nouvelles prend beaucoup de temps à charger donc je réarrangé de telle manière que le fragment de nouvelles à la fin. mais cela prend toujours le même temps pour lancer l'application. J'ai besoin d'aide pour réduire le temps de lancement en montrant d'abord l'onglet fragmenté moins chargé.Comment charger des fragments dans la disposition d'onglet dans un certain ordre afin que je puisse réduire le temps de lancement de l'application

Ceci est mon activité de mise en page Tab, voici mon code \

public class NewActivity extends FragmentActivity { 

     String user_retr_password=null; 
     String newpassword; 
     String dobstr; 
     String currentdate; 
     Boolean doubleBackToExitPressedOnce = false; 
     String id,regid; 
     String mobileno; 

     Session se; 
     UserInfo UInfo; 
     private Toolbar toolbar; 
     private TabLayout tabLayout; 
     private ViewPager viewPager; 
     private int[] tabIcons = { 

       R.drawable.news123, 
       R.drawable.notification, 
       R.drawable.club3, 
       R.drawable.myspaces 
       R.drawable.Home 
     }; 

     ImageButton userImage_ImageButton; 
     Bitmap UserImage = null; 
     Context context; 
     Point p; 
     public static FragmentManager fragmentManager; 
     private ProgressBar mProgressBar; 

     RelativeLayout LoadingPanel; 
     int TabSelected = 0; 

     public static LocationManager locationManager; 
     public static LocationListener locationListener; 

     static List<AdvertizementTableModel.AdvInfo> Adv_List = new ArrayList<AdvertizementTableModel.AdvInfo>(); 
     static List<Bitmap> AdvertizementImagesList = new ArrayList<Bitmap>(); 
     PopupWindow popup; 
     WebView Adv_myWebView; 
     static PopupWindow popupWebView = null; 
     static AnimationDrawable animation = new AnimationDrawable(); 
     static boolean activeActivity = false; 

     private GoogleApiClient client; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.newactivity); 
      context = getApplicationContext(); 

      fragmentManager = getSupportFragmentManager(); 
      UInfo = (UserInfo) getIntent().getSerializableExtra("UInfo"); 


      try { 
       Date dob = UInfo.getDateOfBirth(); 
       SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy"); 
       dobstr = df.format(dob); 
      }catch(Exception e){} 

      Calendar c = Calendar.getInstance(); 


      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      currentdate = sdf.format(c.getTime()); 
      mobileno=UInfo.getMobile().toString(); 

      TabSelected = (Integer) getIntent().getIntExtra("TAB", 0); 

      userImage_ImageButton = (ImageButton) findViewById(R.id.userImage_ImageButton); 
      LoadingPanel = (RelativeLayout) findViewById(R.id.LoadingPanel_NewActivity); 

      viewPager = (ViewPager) findViewById(R.id.viewpager); 
      Adv_myWebView = (WebView) findViewById(R.id.webview); 


      tabLayout = (TabLayout) findViewById(R.id.rsscategory_tabs); 
      tabLayout.setVisibility(View.INVISIBLE); 

      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 



      LoadingPanel.setVisibility(View.VISIBLE); 
      mProgressBar.setVisibility(View.VISIBLE); 

      registerInBackground(); 

      userImage_ImageButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        showPopup(aappen.com.buddiesnew.NewActivity.this, p); 

       } 
      }); 

      GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 

      try { 

       checkEnteryinUser(); 
       checkEnteryinUserprofile(); 
       getIdRegId(UInfo.getMobile()); 

      }catch(Exception e){ 

      } 

      retivepasswordfromphp(); 

     } 

code méthode registerinBackground()

new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      String msg = ""; 

      setUserPicFromSqlite(); 

      return msg; 
     } 

     @Override 
     protected void onPostExecute(String msg) { 

      runOnUiThread(new Runnable() { 
       public void run() { 


        setupViewPager(viewPager); 
        setupTabIcons(); 
        tabLayout.setupWithViewPager(viewPager); 
       } 

      }); 


      ViewTreeObserver vto = userImage_ImageButton.getViewTreeObserver(); 
      vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
       public boolean onPreDraw() { 
        userImage_ImageButton.getViewTreeObserver().removeOnPreDrawListener(this); 
        width = userImage_ImageButton.getMeasuredHeight(); 
        height = userImage_ImageButton.getMeasuredWidth(); 


        Bitmap circleBitmap = getRoundedCroppedBitmap(UserImage, width - 2); 
        userImage_ImageButton.setImageBitmap(circleBitmap); 
        return true; 
       } 
      }); 

      LoadingPanel.setVisibility(View.INVISIBLE); 
      LoadingPanel.setVisibility(View.INVISIBLE); 
      mProgressBar.setVisibility(View.INVISIBLE); 
      tabLayout.setVisibility(View.VISIBLE); 

      getAdvertizementDetailsInBackgroundFromSqlite(); 


     } 
    }.execute(null, null, null); 
} 

onPostExcute a ce code

private void setupTabIcons() { 

     tabLayout.getTabAt(0).setIcon(tabIcons[0]); 
     tabLayout.getTabAt(1).setIcon(tabIcons[1]); 
     tabLayout.getTabAt(2).setIcon(tabIcons[2]); 
     tabLayout.getTabAt(3).setIcon(tabIcons[3]); 
     tabLayout.getTabAt(4).setIcon(tabIcons[4]); 

    } 

    private void setupViewPager(final ViewPager viewPager) { 
     final NewActivity.ViewPagerAdapter adapter = new NewActivity.ViewPagerAdapter(getSupportFragmentManager()); 
     adapter.addFragment(new TabFragment7(), "News"); 
     adapter.addFragment(new TabFragment2(), "Message"); 
     adapter.addFragment(new TabFragment4(), "Club"); 
     adapter.addFragment(new TabFragment0(), "Home"); 
     adapter.addFragment(new TabFragment5(), "My Space"); 

     viewPager.setAdapter(adapter); 
     viewPager.setCurrentItem(TabSelected); 

     viewPager.setOffscreenPageLimit(4); 

     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 


     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 

      } 
     }); 

    } 


ViewPager adapter 



class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager manager) { 
      super(manager); 
     } 

     @Override 
     public Fragment getItem(int position) { 

      return mFragmentList.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragmentList.size(); 
     } 

     public void addFragment(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 

      return mFragmentTitleList.get(position); 
     } 
    } 

Mise en page de l'onglet 0 [ qui obtient le fil de nouvelles]

public class TabFragment0 extends Fragment { 

     UserInfo UInfo; 
     Context context; 
     ImageButton EditImageButton; 
     Bitmap ImageBitmap = null, LogoBitmap=null; 

     int width; 
     int height; 

     TableLayout tl; 
     TableRow tr; 
     ImageView RssurlImageView; 
     Bitmap RssImageBitmap; 
     ImageView RssSourceImage; 
     Activity context1; 
     WebView mWebview; 
     ImageButton closeWebView_Button, RssCategoryEdit_Button,share_ImageButton; 
     List<RSSMasterInfo> RSSMasterList = new ArrayList<RSSMasterInfo>(); 
     String Names,Urls,Imagelinks; 
     String[] newsnames, newsurls, newslogo; 
     List<String> NewsNameList = new ArrayList<String>(); 
     List<String> NewsUrlsList = new ArrayList<String>(); 
     List<String> NewsLogoList = new ArrayList<String>(); 

     List<RSSMasterInfo.RssfeedSubCategoryLink> RssLinkForOnTouch = new ArrayList<RSSMasterInfo.RssfeedSubCategoryLink>(); 
     RSSMasterInfo.RssfeedSubCategoryLink rssOnTouchInfo = new RSSMasterInfo.RssfeedSubCategoryLink(); 
     ScrollView scrollview; 
     ImageButton reloadImageButton; 
     int finalImagecount = 0; 
     static boolean activeActivity = false; 
     static Boolean UpdateImagesFlag = false; 
     SwipeRefreshLayout swipeRss; 
     boolean isItPrinted = false; 
     String Link=null; 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      View view = inflater.inflate(R.layout.tab_fragment_0, null, false); 
      UInfo = (UserInfo) getActivity().getIntent().getSerializableExtra("UInfo"); 
      EditImageButton = (ImageButton) view.findViewById(R.id.Rss_EditImageButton); 
      RelativeLayout rl = (RelativeLayout) view.findViewById(R.id.rssfeed_relativelayout); 
      tl = (TableLayout) view.findViewById(R.id.rsstablelayout); 
      reloadImageButton = (ImageButton) view.findViewById(R.id.ReloadImages_ImageButton); 
      mWebview = (WebView) view.findViewById(R.id.rssFeed_WebView); 
      closeWebView_Button = (ImageButton) view.findViewById(R.id.closeWebView_Button); 
      RssCategoryEdit_Button = (ImageButton) view.findViewById(R.id.Rss_EditImageButton); 
      scrollview = (ScrollView) view.findViewById(R.id.mainscrollView); 
      share_ImageButton=(ImageButton)view.findViewById(R.id.share_ImageButton); 

      // swipeRss = (SwipeRefreshLayout) view.findViewById(R.id.swipreRssRefresh); 
      mWebview.setVisibility(View.INVISIBLE); 
      closeWebView_Button.setVisibility(View.INVISIBLE); 
      share_ImageButton.setVisibility(View.INVISIBLE); 
      context = getActivity().getApplicationContext(); 
      context1 = getActivity(); 




      deleteRssImages(); 
      RssSourceImage = (ImageView) view.findViewById(R.id.RssSourceImageView); 

      finalImagecount = 0; //Returns the number of STATIC IMAGES i.e The Images that are loaded when there is no RSS FEED. 


      reloadImageButton.setVisibility(View.VISIBLE); 
      reloadImageButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        reloadImageButton.setVisibility(View.VISIBLE); 
        tryGetNewFeed(); 


       } 
      }); 


      scrollview.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 

        onTouchEvent(event); 
        return false; 
       } 
      }); 


      return view; 

     } 


     @Override 
     public void onStart() { 
      super.onStart(); 
      try { 
       //startFeedTab(); 
       getFinalRSSfeeds(); //this gets Rss news feed..... 
       // tryGetNewFeed(); 

      } catch (Exception e1) { 

       e1.printStackTrace(); 
      } 
     activeActivity = true; 
     } 

Répondre

0

bien, vous pouvez effectuer la demande une fois que vous ouvrez l'application et enregistrez les données récupérées en utilisant DB ou sharedPreferences et une fois que l'utilisateur ouvre l'onglet afficher les données stockées. C'est une solution, je pense que j'ai déjà fait quelque chose comme ça, mais c'était avec une liste d'images et ça a marché.

Vous pouvez également essayer une bibliothèque de réseau qui peut récupérer les données plus rapidement que le AsyncTask natif, tel que: Fast Android Networking ou Android Asynchronous Http Client etc.

0

Pour réduire le temps de lancement de l'application, vous pouvez suivre une approche de base.

Vous pouvez créer un faux fragment sans vue, et le remplacer plus tard avec vos fragments d'origine après un certain délai.

En vous pagerAdaptergetItem(), vous pouvez modifier comme ci-dessous:

public Fragment getItem(int position) { 
     if (position == TAB_ONE) { 
      if (Utility.isEmpty(fragmentOne)) { 
       //Here I pass the fragment to be loaded along with the delay, i.e. 50ms 
       fragmentOne = FragmentFake.create(new FragmentOne(), 50); 
      } 
      return fragment; 
     } else if (position == TAB_TWO) { 
      if (Utility.isEmpty(fragmentTwo)) { 
       //FragmentTwo created with a delay of 100ms 
       fragmentTwo = FragmentFake.create(new FragmentOne(), 100); 
      } 
      return fragmentTwo; 
     } else if (position == TAB_THREE) { 
      if (Utility.isEmpty(fragmentThree)) { 
       //FragmentThree created with a delay of 100ms 
       fragmentThree = FragmentFake.create(new FragmentThree(), 150); 
      } 
      return fragmentThree; 
     } 
     return null; 
    } 

Et votre FragmentFake classe sera comme:

public class FragmentFake extends Fragment { 

private View root; 
Fragment fragment; 

public static Fragment create(Fragment frag, int timeMs) { 
    FragmentFake fragmentFake = new FragmentFake(); 
    Bundle bundle = new Bundle(); 
    fragmentFake.fragment = frag; 
    bundle.putInt("time", timeMs); 
    fragmentFake.setArguments(bundle); 
    return fragmentFake; 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    root = inflater.inflate(R.layout.layout_fake_fragment, container, false); 
    Bundle bundle = getArguments(); 
    replaceFragment(bundle.getInt("time")); 
    return root; 
} 

//Replacing fragments with a delay 
private void replaceFragment(int time) { 
    root.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      if(!isAdded()){ 
       return; 
      } 
      if (!Utility.isEmpty(fragment)) { 
       getChildFragmentManager().beginTransaction().add(R.id.replace_fragment_container, fragment).commit(); 
      } 
     } 
    }, time); 
} 
} 

Utility.java

public class Utility { 
    public static boolean isEmpty(Object object) { 
    return object == null; 
    } 
} 

La mise en page FragmentFake est juste un FrameLayout qui contiendra les fragments remplacés

fragment_fake_layout.xml

<FrameLayout 
    android:id="@+id/replace_fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

</FrameLayout> 
+0

Merci pour passer votre temps précieux pour me aider à sortir de ce problème. mais le problème est avec ce fragment de flux RSS qui mange le temps de lancement de mon application, donc je ne veux pas charger ce fragment au moment du lancement, si je sera en mesure de charger le fragment moins chargé au lancement, puis je peux charger les nouvelles Je ne pense pas pouvoir y parvenir si j'utilise View Pager. Avez-vous une idée? Si oui, faites le moi savoir. et je ne sais pas comment cette fausse astuce de fragment fonctionne mais certainement mal essayer. Merci l'homme pour votre réponse précieuse. –

+0

puis-je savoir ce qui est utilitaire dans ce code? Si c'est une classe alors s'il vous plaît poster le code pour la classe utilitaire. Merci d'avance. –

+0

C'est juste une classe d'aide pour vérifier si l'objet est nul. J'ai ajouté la classe dans l'édition –