2017-09-09 1 views
0

Ich habe Tab-Layout mit 5 Tabs jeder hat separate Fragmente, erste Fragment zeigt RSS News Feed, die vom Server abgeholt werden, nimmt diese Nachricht Fragment viel von Zeit zu laden, also habe ich so neu arrangiert, dass Nachrichtenfragmente am Ende. aber es dauert immer noch die gleiche Zeit, um die App zu starten. Ich brauche etwas Hilfe, um die Startzeit zu verkürzen, indem ich zuerst weniger geladene fragmentierte Tabs zeige.Wie Fragmente in Tab-Layout in bestimmter Reihenfolge zu laden, so dass ich App-Startzeit reduzieren kann

Das ist mein Tab Layout-Aktivität ist, hier ist mein 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(); 

     } 

registerinBackground() -Methode Code

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 hat diesen 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); 
     } 
    } 

Tab Layout-0 [ welches Nachrichtenfeed erhält]

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; 
     } 

Antwort

0

Nun, Sie können die Anfrage ausführen, sobald Sie die App öffnen und die abgerufenen Daten mit DB oder sharedPreferences speichern und wenn der Benutzer die Registerkarte öffnet, werden die gespeicherten Daten angezeigt. Das ist eine Lösung, ich denke, ich habe so etwas schon einmal gemacht, aber es war mit einer Liste von Bildern und es hat funktioniert.

Sie können auch eine Netzwerkbibliothek versuchen, die die Daten schneller als die native AsyncTask holen können, wie zum Beispiel: Fast Android Networking oder Android Asynchronous Http Client usw.

0

die App Einführungszeit zu reduzieren, können Sie einen Ansatz verfolgen.

Sie können ein gefälschtes Fragment ohne Ansichten erstellen und später nach einer gewissen Verzögerung durch Ihre ursprünglichen Fragmente ersetzen.

In Sie pagerAdaptergetItem(), können Sie wie unten ändern:

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; 
    } 

Und Ihre FragmentFake Klasse wie:

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; 
    } 
} 

Die FragmentFake Layout ist nur ein FrameLayout, die ersetzt Fragmente

fragment_fake_layout.xml

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

</FrameLayout> 
+0

Dank für Ihre Ausgaben wertvolle Zeit mir dieses Problems enthalten zu helfen. aber das Problem ist mit dem RSS-Feed-Fragment, das die Startzeit meiner App auffrischt, also möchte ich dieses Fragment nicht zum Startzeitpunkt laden, wenn ich weniger geladene Fragmente beim Start laden kann, dann kann ich die Nachrichten laden feed fragment am letzten, ich glaube nicht, dass ich es erreichen kann, wenn ich View Pager benutze. Hast du eine Idee? Wenn ja, lass es mich wissen. und ich weiß nicht, wie dieser gefälschte Fragment-Trick funktioniert, aber auf jeden Fall schlecht ausprobieren. Vielen Dank für Ihre wertvolle Antwort. –

+0

kann ich wissen, was Dienstprogramm in diesem Code ist? Wenn es eine Klasse ist, dann poste bitte den Code für die Utility-Klasse. Vielen Dank im Voraus. –

+0

Es ist nur eine Hilfsklasse, um zu überprüfen, ob das Objekt null ist. Ich habe die Klasse in der Bearbeitung hinzugefügt –

Verwandte Themen