Android ViewPager 和 TabLayout 运行不快

Android ViewPager and TabLayout are not working fast

存在 TabLayoutViewPager 的嵌套片段。每个片段内部都有列表视图,因此它们可以一起调用,现在我遇到了应用程序处理缓慢的问题。我已经尝试过一些解决方案,例如 volley library,但它对我不起作用。有关更多信息,我也发布了我的代码,所以请指导我做到最好。

MainTabFragment.java

public class MainTabFragment extends Fragment {

public static int position_child_tab = 0, three_childs_tab_position = 0;
static int count = -1;
int position_tab = 0;
Bundle args;
MyTabLayout myTabLayout;

public MainTabFragment() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment MainTabFragment.
 */
// TODO: Rename and change types and number of parameters
public static MainTabFragment newInstance(String param1, String param2) {

    return new MainTabFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.main_tab_fragment, container, false);
    myTabLayout = (MyTabLayout) view.findViewById(R.id.mainTabLayout);
    NonSiwpablePager pager = (NonSiwpablePager) view.findViewById(R.id.pager);
    args = getArguments();
    if (args != null && args.containsKey("pos_next"))
        position_tab = args.getInt("pos_next");
    if (args != null && args.containsKey("pos_end"))
        position_child_tab = args.getInt("pos_end");
    if (position_child_tab != 3) {
        three_childs_tab_position = position_child_tab;
    } else {
        three_childs_tab_position = 0;
    }
    args = new Bundle();
    args.putInt("pos_end", position_child_tab);
    ViewPagerAdapter mAdapter = getViewPagerAdapter();
    pager.setAdapter(mAdapter);
    pager.setOffscreenPageLimit(4);
    myTabLayout.setupWithViewPager(pager);
    for (int i = 0; i < mAdapter.getCount(); i++) {
        View customView = mAdapter.getCustomeView(getActivity(), i);
        myTabLayout.getTabAt(i).setCustomView(customView);
    }
    pager.setCurrentItem(position_tab);
    return view;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    myTabLayout.getTabAt(position_tab).getCustomView().setSelected(true);
}

private ViewPagerAdapter getViewPagerAdapter() {
    ViewPagerAdapter mAdapter = new ViewPagerAdapter(getChildFragmentManager());
    String title_arr[] = {"ADVISORY", "TOP ADVISORS", "EXPERT VIEW"};
    for (int i = 0; i < title_arr.length; i++) {
        Map<String, Object> map = new Hashtable<>();
        map.put(ViewPagerAdapter.KEY_TITLE, title_arr[i]);
        if (i == 0) {
            map.put(ViewPagerAdapter.KEY_FRAGMENT, AdvisoryPagerFragment.newInstance());
        } else if (i == 1) {
            map.put(ViewPagerAdapter.KEY_FRAGMENT, TopAdvisoryPagerFragment.newInstance());
        } else if (i == 2) {
            map.put(ViewPagerAdapter.KEY_FRAGMENT, ExperViewPagerFragment.newInstance());
        }
        mAdapter.addFragmentAndTitle(map);

    }
    return mAdapter;
}

public static class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private static final String KEY_TITLE = "fragment_title";
    private static final String KEY_FRAGMENT = "fragment";
    boolean abc = false;
    private int[] drawables = new int[]{R.drawable.advisory_selector, R.drawable.top_advisors_selector, R.drawable.expertview_selector};
    private List<Map<String, Object>> maps = new ArrayList<>();

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

    public View getCustomeView(Context context, int pos) {
        View mView = LayoutInflater.from(context).inflate(R.layout.custom_tab_view, null);
        TextView mTextView = (TextView) mView.findViewById(R.id.textView);
        mTextView.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/ufonts.com_cambria.ttf"));
        ImageView mImageView = (ImageView) mView.findViewById(R.id.imageView2);
        mImageView.setTag(pos);

        /*if(count >0)
        {
            Toast.makeText(context,"Count Is "+count,Toast.LENGTH_SHORT).show();
            mImageView =  (ImageView) mImageView.getTag(0);
            mImageView.setSelected(false);
        }
        */
        mImageView.setImageResource(drawables[pos]);
        mTextView.setText(getPageTitle(pos));
        return mView;
    }

    public void addFragmentAndTitle(Map<String, Object> map) {
        maps.add(map);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return (CharSequence) maps.get(position).get(KEY_TITLE);
    }

    @Override
    public Fragment getItem(int position) {

        return (Fragment) maps.get(position).get(KEY_FRAGMENT);
    }

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


}

MainTabFragment 的子片段如下:

AdvisoryPagerFragment.java

public class AdvisoryPagerFragment extends Fragment {
static String advisory_child_fragments[];
int myID = 0;
Bundle bundle;
TabLayout mTabLayout;

public AdvisoryPagerFragment() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @return A new instance of fragment AdvisoryPagerFragment.
 */

public static AdvisoryPagerFragment newInstance() {
    return new AdvisoryPagerFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View inflate = inflater.inflate(R.layout.fragment_app_pager, container, false);
    /*Bundle args = getArguments();
    if (args  != null && args.containsKey("pos_end"))
         myID = args.getInt("pos_end");*/
    myID = MainTabFragment.position_child_tab;
    mTabLayout = (TabLayout) inflate.findViewById(R.id.fragmentTabLayout);
    advisory_child_fragments = new String[]{"EQUITY", "INDICES", "COMMODITY", "CURRENCY"};
    ViewPager pager = (ViewPager) inflate.findViewById(R.id.fragment_pager);
    FragmentViewPagerAdapter mPagerAdapter = new FragmentViewPagerAdapter(getChildFragmentManager());
    pager.setAdapter(mPagerAdapter);
    mTabLayout.setupWithViewPager(pager);
    for (int i = 0; i < mPagerAdapter.getCount(); i++) {
        View customView = mPagerAdapter.getCustomeView(getActivity(), i);
        mTabLayout.getTabAt(i).setCustomView(customView);
    }
    pager.setCurrentItem(myID);
    return inflate;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mTabLayout.getTabAt(myID).getCustomView().setSelected(true);
}

public static class FragmentViewPagerAdapter extends FragmentStatePagerAdapter {
    public FragmentViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public View getCustomeView(Context context, int pos) {
        View mView = LayoutInflater.from(context).inflate(R.layout.custom_view, null);
        TextView mTextView = (TextView) mView.findViewById(R.id.belowTab_textview);
        mTextView.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/ufonts.com_cambria.ttf"));
        mTextView.setText(getPageTitle(pos));
        return mView;
    }

    //
    @Override
    public CharSequence getPageTitle(int position) {
        return advisory_child_fragments[position];
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new EquityFragment();
            case 1:
                return new IndicesFragment();
            case 2:
                return new CommodityFragment();
            case 3:
                return new CurrencyFragment();
        }
        return null;
    }

    @Override
    public int getCount() {
        return 4;
    }
 }
 }

上面AdvisoryPagerFragment的子片段是

EquityFragment.java

public class EquityFragment extends android.support.v4.app.Fragment implements SearchView.OnQueryTextListener {
public static String imagepath = null;
static ArrayList<EquityDetails> catListDao = new ArrayList<EquityDetails>();
static ArrayList<EquityDetails> catListDao1 = new ArrayList<EquityDetails>();
static int count = 0;
static int count1 = 0;
ListView list;
View view;
Activity act;
AdvisorsAdapter adapter;
TextView empty_text;
private boolean isViewShown = false;
ProgressBar progressBar;

public static EquityFragment newInstance() {
    return new EquityFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.equity_activity, container, false);
    act = this.getActivity();
    Log.d("Callled ", "" + count);
    count++;
    return view;
}

public void onActivityCreated(Bundle savedInstanceState1) {
    super.onActivityCreated(savedInstanceState1);
    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
    list = (ListView) view.findViewById(R.id.list_equity);
    setHasOptionsMenu(true);
    empty_text = (TextView) view.findViewById(R.id.empty);
    progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
    if (Utils.isNetworkAvailable(getActivity())) {
        if (catListDao.size() > 0) {
            adapter = new AdvisorsAdapter(act, R.layout.custom_equity, catListDao, 5);
            list.setAdapter(adapter);
        } else {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // do some work here
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //   if (!isViewShown) {
                            new FetchAllData(getActivity(), 5).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                            //    }
                        }
                    });
                }
            }).start();
        }
    } else {
        CustomToast toast = new CustomToast(getActivity(), "There is no internet connection!");
    }
 }

FetchdataClass 从服务中获取数据并添加到 ListView

public class FetchAllData extends AsyncTask<Void, Void, String> {
    ProgressDialog pDialog;
    int typeId;
    private Context cont;

    public FetchAllData(Context con, int typeId) {
        // TODO Auto-generated constructor stub
        this.cont = con;
        this.typeId = typeId;
        Log.d("Constructor Called", "yes");
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();

        progressBar.setVisibility(View.VISIBLE);
    }


    @Override
    protected String doInBackground(Void... params) {
        // TODO Auto-generated method stub
        return getString();
    }

    private String getString() {
        // TODO Auto-generated method stub


        URL obj = null;
        HttpURLConnection con = null;
        try {
            obj = new URL(Constants.AppBaseUrl + "/call_listing/" + typeId);
            String userPassword = "oi" + ":" + "kl";
            String header = "Basic " + new String(android.util.Base64.encode(userPassword.getBytes(), android.util.Base64.NO_WRAP));
            con = (HttpURLConnection) obj.openConnection();
            con.addRequestProperty("Authorization", header);
            con.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
            con.setRequestMethod("POST");


            // For POST only - BEGIN
            con.setDoOutput(true);
            OutputStream os = con.getOutputStream();

            os.flush();
            os.close();
            // For POST only - END

            int responseCode = con.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) { //success
                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                Log.i("TAG", response.toString());
                return response.toString();


            } else {
                Log.i("TAG", "POST request did not work.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);


        if (result != null) {
            //    pDialog.dismiss();
            progressBar.setVisibility(View.GONE);
            JSONObject jsonObject;
            try {
                catListDao = new ArrayList<EquityDetails>();
                jsonObject = new JSONObject(result);
                JSONArray jsonArray = jsonObject.getJSONArray("list");

                Log.d("Length ", "" + jsonArray.length());
                for (int i = 0; i < jsonArray.length(); i++) {
                    EquityDetails allDirectory = new EquityDetails();
                    allDirectory.setEntry_value(jsonArray.getJSONObject(i).getString("entry"));
                    allDirectory.setSerial_value(jsonArray.getJSONObject(i).getString("sl"));
                    allDirectory.setTg_value1(jsonArray.getJSONObject(i).getString("tgt_1"));
                    allDirectory.setTg_value2(jsonArray.getJSONObject(i).getString("tgt_2"));
                    allDirectory.setMainTitle_value(jsonArray.getJSONObject(i).getString("script"));
                    allDirectory.setMain_subTitle_value(jsonArray.getJSONObject(i).getString("exchange"));
                    allDirectory.setRating_value(jsonArray.getJSONObject(i).getString("rating"));
                    allDirectory.setReview_value(jsonArray.getJSONObject(i).getString("review"));
                    allDirectory.setImage1(jsonArray.getJSONObject(i).getString("advisor_image"));
                    allDirectory.setPosted_by(jsonArray.getJSONObject(i).getString("posted_by"));
                    allDirectory.setImage2(jsonArray.getJSONObject(i).getString("script_image"));
                    allDirectory.setCall_id(jsonArray.getJSONObject(i).getString("call_id"));
                    allDirectory.setBuy(jsonArray.getJSONObject(i).getString("buy_sentiment"));
                    allDirectory.setSell(jsonArray.getJSONObject(i).getString("sell_sentiment"));
                    allDirectory.setRecommend(jsonArray.getJSONObject(i).getString("recommendation"));
                    allDirectory.setPosted_date(jsonArray.getJSONObject(i).getString("posted_date"));
                    allDirectory.setExpiry_date(jsonArray.getJSONObject(i).getString("expiry_date"));
                    catListDao.add(allDirectory);
                }
                catListDao1 = catListDao;
                ab = true;
                adapter = new AdvisorsAdapter(act, R.layout.custom_equity, catListDao, 0);
                list.setAdapter(adapter);
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
        //pDialog.dismiss();
        progressBar.setVisibility(View.GONE);

    }


}

你的

onActivityCreated(Bundle savedInstanceState1)"

在 EquityFragment.java 中很奇怪。首先,不要停用 StrictMode(因为您忽略了抛出的 "NetworkOnMainThread" 异常,这很可能是您的代码运行缓慢的原因...)

然后看else部分:

 } else {
    new Thread(new Runnable() {
            @Override
            public void run() {
                // do some work here
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //   if (!isViewShown) {
                        new FetchAllData(getActivity(), 5).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                        //    }
                    }
                });
            }
        }).start();
}

你开始一个新线程,你应该在其中处理你的网络内容。而不是这样做,你 return 到 ui 线程(如果你在这里做网络东西,应用程序将挂起)在你的新线程中并在 ui 线程上执行它。(我不知道 FetchAllData 到底做了什么)。

} else {
    new FetchAllData(getActivity(), 5).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

应该做同样的工作。

在您的 FetchAllData class 中,您在 onPostExecute 中执行所有 JSON 解析。 在 doInBackground 中进行解析,仅在 onPostExecute 中设置适配器。

我会建议你添加另一种方法。

@Override
public void setMenuVisibility(boolean menuVisible) {
    super.setMenuVisibility(menuVisible);

    if (menuVisible) {
       Log.e("SetMenuVisibleFragmentA" , menuVisible + " ");
    }

}

public void setMenuVisibility (boolean menuVisible)

Set a hint for whether this fragment's menu should be visible. This is useful if you know that a fragment has been placed in your view hierarchy so that the user can not currently seen it, so any menu items it has should also not be shown.

Parameters

menuVisible :: The default is true, meaning the fragment's menu will be shown as usual. If false, the user will not see the menu.

尝试设置

pager.setOffscreenPageLimit(no_of_fragments or pages);

在 asyctask 中完成创建片段的所有任务

看来你在onPostExecute方法中做的太多了。 尝试解析 JSON 并在后台设置数据并通知 UIthread 中的更改可能是可行的。

  1. 将代码从 OnActivityCreated() 移至 onViewCreated()

  2. 尽可能使用 Gson。(它在我的项目中节省了宝贵的时间。)

  3. Post 如果可能的话,你的适配器代码。如果您在 getView() 中进行了太多操作,请避免使用它。

  4. 在您的 AsyncTask 中,您正在使用 UI 个元素。我知道我们可以访问 onPostExecute() 中的 UI 组件,但是尝试使用 runOnUIThread() 在 UI 线程上 ro 运行 该代码。它提高了性能。