2017-09-09 4 views
0

5個のタブを持つタブレイアウトがあり、それぞれフラグメントが分離されています。サーバーからフェッチされたRSSニュースフィードが表示されます。ロードする時間のために、私は最後にニュースが断片化するように再編成しました。それでもアプリを起動するには同じ時間がかかります。私は最初にロードされた断片化されていないタブを表示することによって、起動時間を短縮するためにいくつかの助けが必要です。タブレイアウトでフラグメントを特定の順序でロードしてアプリの起動時間を短縮できるようにする

この私のタブレイアウトの活動で、ここに私のコードは\

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()メソッドのコード

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は、[このコード

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

タブレイアウト0を持っていますニュースフィードを取得する]

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

答えて

0

よくアプリケーションを開いてDBまたはsharedPreferencesを使用して取得したデータを保存し、ユーザーがタブを開いて保存したデータを表示すると、要求を実行できます。 これは解決策ですが、私は前にこのようなことをしたと思いますが、それは画像のリストであり、うまくいきました。

またのような、より高速なネイティブAsyncTaskよりデータを取得することができますネットワークライブラリを試すことができます、あなたは基本的なアプローチに従うことができ、アプリケーションの起動時間を短縮するためにFast Android NetworkingまたはAndroid Asynchronous Http Clientなど

0

ビューのない偽のフラグメントを作成し、後でそのフラグメントを元のフラグメントに置き換えることができます。

あなたpagerAdaptergetItem()では、以下のように変更することができます。

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

そして、あなたのFragmentFakeクラスのようになります:

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

FragmentFakeレイアウトはちょうど交換した断片

fragment_fake_layout.xmlこの問題の外に私を助けるためにあなたの貴重な時間を過ごすための

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

</FrameLayout> 
+0

感謝を含んでいますFrameLayoutです。しかし問題は、私のアプリの起動時間を食べているので、私は 起動時に読み込まれた断片を読み込むことができますし、私はニュースを読み込むことができる場合、起動時にその断片をロードしたくないRSSフィードの断片です私がView Pagerを使っていれば、私はそれを達成できるとは思わない。あなたは何か考えていますか?はいの場合はお知らせください。私はこの偽の断片トリックがどのように動作するのか分かりませんが、間違いなく試してみてください。あなたの貴重な返事をくれてありがとう。 –

+0

私はそのコードでユーティリティーが何であるか知っていますか?そのクラスの場合は、Utilityクラスのコードを投稿してください。前もって感謝します。 –

+0

オブジェクトがnullかどうかを確認するのはヘルパークラスに過ぎません。編集のクラスを追加しました –

関連する問題