android切换卡顿解决方法

如果想要让应用用户流畅的滑动体验的话,那么就必须对activity和fragment的生命周期有一个完整的概念以及在何种情况下会触发哪些事件。

在自己目前做的项目中,就遇到了这样的问题,那么就把自己的解决方法罗列,重点在于onpause,onstop,onstart,onresume的事件处理。

某些耗时的操作延迟加载,先展示总体页面。

当对某些复杂的页面进行切换时,先隐藏后显示,如果不是特别卡顿不需要隐藏,如果卡顿严重的话强烈推荐隐藏,提升用户体验。

代码如下:

package com.hengtiansoft.mecb.fragment;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import android.widget.RadioGroup.OnCheckedChangeListener;

import com.hengtiansoft.mecb.R;
import com.hengtiansoft.mecb.adapter.FragmentTabPagerAdapter;
import com.hengtiansoft.mecb.adapter.ProductOnSaleAdapter;
import com.hengtiansoft.mecb.model.MenuProductOnSaleModel;
import com.viewpagerindicator.UnderlinePageIndicator;

public class MenuProductFragment extends BaseFragment{

    private ViewPager mVpProductPage;
    private FragmentTabPagerAdapter mTabPagerProductAdapter;
    private List<BaseFragment> mProductTabFragment;

    private RadioGroup mRgProductTab;
    private RadioButton mRbOnSale;
    private RadioButton mRbForSale;
    private RadioButton mRbOffSale;

    private UnderlinePageIndicator mIndicator;
    private View mView;

    //流畅显示切换所用的线程
    private Handler handler = new Handler();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.fragment_menu_product, container, false);
        initView(mView);

        return mView;
    }

    @Override
    public void onStart() {
        super.onStart();
        handler.postDelayed(new Runnable() {
            public void run() {
                setData(mView);
            }
        }, 200);
        setListener(mView);
    }

    @Override
    public void onResume() {
        super.onResume();
        handler.postDelayed(new Runnable() {
            public void run() {
                mVpProductPage.setVisibility(View.VISIBLE);
            }
        }, 0);
    }

    @Override
    public void onPause() {
        super.onPause();
        handler.postDelayed(new Runnable() {
            public void run() {
                mVpProductPage.setVisibility(View.INVISIBLE);
            }
        }, 100);
    }

    private void initView(View view) {
        mVpProductPage = (ViewPager)view.findViewById(R.id.vp_product_page);
        mIndicator = (UnderlinePageIndicator)view.findViewById(R.id.indicator_product_sort);
        mRgProductTab = (RadioGroup) view.findViewById(R.id.rg_product_tab);
        mRbOnSale = (RadioButton)view.findViewById(R.id.rb_product_onsale);
        mRbOffSale = (RadioButton)view.findViewById(R.id.rb_product_offsale);
        mRbForSale = (RadioButton)view.findViewById(R.id.rb_product_forsale);
    }

    private void setData(View view) {
        mProductTabFragment = new ArrayList<BaseFragment>();
        mProductTabFragment.add(new ProductOnSaleFragment());
        mProductTabFragment.add(new ProductForSaleFragment());
        mProductTabFragment.add(new ProductOffSaleFragment());

        mTabPagerProductAdapter = new FragmentTabPagerAdapter(mProductTabFragment,
                getChildFragmentManager());
        mVpProductPage.setAdapter(mTabPagerProductAdapter);
        mVpProductPage.setOffscreenPageLimit(2);
        mIndicator.setViewPager(mVpProductPage);
        mIndicator.setFades(false);
    }

    private void setListener(View view) {
        mRgProductTab.setOnCheckedChangeListener(new OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(RadioGroup arg0, int checkedId) {
                if(checkedId == mRbOnSale.getId()){
                    mVpProductPage.setCurrentItem(0,false);
                }else if(checkedId == mRbForSale.getId()){
                    mVpProductPage.setCurrentItem(1,false);
                }else{
                    mVpProductPage.setCurrentItem(2,false);
                }
            }
        });

        mIndicator.setOnPageChangeListener(new OnPageChangeListener(){

            @Override
            public void onPageScrollStateChanged(int position) {
            }
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }
            @Override
            public void onPageSelected(int position) {
                switch(position){
                case 0:
                    mRbOnSale.setChecked(true);
                    break;
                case 1:
                    mRbForSale.setChecked(true);
                    break;
                case 2:
                    mRbOffSale.setChecked(true);
                    break;
                default:
                    break;
                }
            }
        });

    }

}
时间: 2024-08-29 20:17:24

android切换卡顿解决方法的相关文章

h5页面滑动卡顿解决方法

解决方式: 给滚动的元素加样式:-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling(允许独立的滚动区域和触摸回弹) 如果值为auto,就是普通的滚动,手指离开就停止滚动,让人感觉有点卡顿 如果设置为touch,在手指离开后还会滚一下,有回弹效果,看上去很流畅 但是刚开始用的时候有个小bug,h5页面打包成app时,一开始写成了*{-webkit-overflow-scrolling: touch;},导致滚动到最后页面底部出

android viewpager fragment切换时界面卡顿解决办法

目前开发的程序在切换View时界面卡顿现象比较严重,影响用户体验,当前项目共就四个View,每个View也只是按钮,所以可以同时加载,不让其它view销毁. 只需在Adapter中重载destroyItem类即可 @Override public void destroyItem(ViewGroup container, int position, Object object) { //重载该方法,防止其它视图被销毁,防止加载视图卡顿 //super.destroyItem(container,

ART:Android 摆脱卡顿的希望?

与 iOS 相比,Android 的用户体验有个相对糟糕的开始.在很长的时间里,界面一直丑小鸭,卡顿也是挥不去的痛.不过,在 Google 的全力推动,以及硬件厂商的响应下,Android 还是跨越各种阻碍,逐渐壮大起来了. 在此过程中,Google 也在经历着重大的变化.它逐渐从一个只重视数据的公司,转变为一个重视设计和用户体验的公司.从 Android 4.0 开始,Android 拥有了自己的设计语言和应用设计指导.与此同时,Google 也在着手解决卡顿问题.Android 4.1 的“

新版本MacBook Pro 微信卡顿 解决办法

环境: 型号:MacBook Pro (16-inch, 2019) 处理器:2.6 GHz 六核Intel Core i7 版本:10.15.3 (19D76) 现象:切换到微信时卡顿,输入文字,发送消息时,卡顿 解决办法: 关闭自动切换独显 操作:#强制使用核显(集成显卡)sudo pmset -a GPUSwitch 0#强制使用独立显卡sudo pmset -a GPUSwitch 1#自动切换(切记不要使用这个)sudo pmset -a GPUSwitch 2 参考资料:http:/

android.view.WindowLeaked的解决方法

Android.view.WindowLeaked一般会发生在Activity中Dialog的显示. android的dialog创建的时候会传入一个参数this,就是当前的activity,dialog必须在Activity销毁之前放掉,否则就会报windowleaked的错误. 分析这个原因是: Dialog是基于Activity而创建的:new ProgressDialog(this):this 就是Activity.Activtity先finish,那Dialog就没得依附了,所以就会报

安装Android studio出现&#39;tools.jar&#39; seems to be not in Android Studio classpath......的解决方法

安装Android studio出现'tools.jar' seems to be not in Android Studio classpath......的解决方法 原创 2015年07月31日 10:45:36 标签: android studio / 安装问题 5874 一.出现的问题 最近项目要把代码迁移到Android studio上,于是下载了最新的Android studio的安装程序,按着网上的步骤进行了安装,结果第一次启动后,出现了一个错误: 'tools.jar' seem

Android卡顿优化:卡顿分析方法

基础知识在具体讲卡顿工具前,你需要了解一些基础知识,它们主要都和 CPU 相关.造成卡顿的原因可能有千百种,不过最终都会反映到CPU 时间上.我们可以把 CPU 时间分为两种:用户时间和系统时间.用户时间就是执行用户态应用程序代码所消耗的时间:系统时间就是执行内核态系统调用所消耗的时间,包括 I/O.锁.中断以及其他系统调用的时间. CPU 性能在开发过程中,我们可以通过下面的方法获得设备的 CPU 信息.// 获取 CPU 核心数cat /sys/devices/system/cpu/poss

Android Studio 工具栏切换卡顿

首先上解决方案:开启Docked Mode,关闭Pinned Mode. 问题来由: Android Studio 开始使用的时候,不喜欢开启Docked Mode后代码编辑器的大小总是在变化,于是关了~~ 后来各种卡顿,内存升到8G也没管事,也没想起来改过这个选项~~内心琢磨着这个玩意怎么这尿性.. 直到一天重装了AS,修改这个选项的时候发现修改前后差距不是一般般~~~~

Android App卡顿慢优化之多线程优化

本博客涉及的内容有:多线程并发的性能问题,介绍了AsyncTask,HandlerThread,IntentService与ThreadPool分别适合的使用场景以及各自的使用注意事项,这是一篇了解Android多线程编程不可多得的基础文章,清楚的了解这些Android系统提供的多线程基础组件之间的差异以及优缺点,才能够在项目实战中做出最恰当的选择. 1)Threading Performance(线程性能问题) 在程序开发的实践当中,为了让程序表现得更加流畅,我们肯定会需要使用到多线程来提升程