viewpager.setcurrentitem导致的ANR

article/2025/9/23 0:12:13

参考:Java线程Dump分析工具–jstack

dump 文件里,值得关注的线程状态有:
死锁,Deadlock(重点关注)
执行中,Runnable
等待资源,Waiting on condition(重点关注)
等待获取监视器,Waiting on monitor entry(重点关注)
暂停,Suspended
对象等待中,Object.wait() 或 TIMED_WAITING
阻塞,Blocked(重点关注)
停止,Parked

分析:

先在cmd导出trace.txt文件:

adb pull /data/anr/traces.txt

ANR的 trace.txt 如下:


----- pid 12909 at 2018-07-12 18:15:29 -----
Cmd line: com.dch.dai
Build fingerprint: 'Xiaomi/chiron/chiron:8.0.0/OPR1.170623.027/8.2.1:user/release-keys'
ABI: 'arm64'
Build type: optimized
Zygote loaded classes=4895 post zygote classes=1815
Intern table: 75547 strong; 134 weak
JNI: CheckJNI is on; globals=816 (plus 67 weak)
Libraries: /system/app/WebViewGoogle/WebViewGoogle.apk!/lib/arm64-v8a/libwebviewchromium.so /system/lib64/libandroid.so /system/lib64/libcompiler_rt.so /system/lib64/libjavacrypto.so /system/lib64/libjnigraphics.so /system/lib64/libmedia_jni.so /system/lib64/libmiuiclassproxy.so /system/lib64/libmiuinative.so /system/lib64/libqti_performance.so /system/lib64/libsoundpool.so /system/lib64/libwebviewchromium_loader.so /system/lib64/libwebviewchromium_plat_support.so libjavacore.so libopenjdk.so (14)
/data/app/com.dch.dai-N54RdMqTyLjfusMZSC1tgQ==/oat/arm64/base.odex: quicken
/data/dalvik-cache/arm64/system@app@WebViewGoogle@WebViewGoogle.apk@classes.dex: speed
/system/framework/oat/arm64/gson.odex: quicken
/system/framework/oat/arm64/volley.odex: quicken
/data/dalvik-cache/arm64/system@app@MiuiContentCatcher@MiuiContentCatcher.apk@classes.dex: speed
Current JIT code cache size: 998KB
Current JIT data cache size: 597KB
Current JIT capacity: 2MB
Current number of JIT code cache entries: 1912
Total number of JIT compilations: 2053
Total number of JIT compilations for on stack replacement: 2
Total number of JIT code cache collections: 9
Memory used for stack maps: Avg: 183B Max: 19KB Min: 24B
Memory used for compiled code: Avg: 505B Max: 41KB Min: 4B
Memory used for profiling info: Avg: 134B Max: 5KB Min: 32B
Start Dumping histograms for 2065 iterations for JIT timings
Compiling:  Sum: 2.584s 99% C.I. 0.024ms-14.751ms Avg: 1.257ms Max: 53.463ms
TrimMaps:   Sum: 122.034ms 99% C.I. 5us-617.999us Avg: 59.355us Max: 1861us
Code cache collection:  Sum: 9.911ms 99% C.I. 0.311ms-5.015ms Avg: 1.101ms Max: 5.182ms
Done Dumping histograms
Memory used for compilation: Avg: 126KB Max: 8MB Min: 21KB
ProfileSaver total_bytes_written=11503
ProfileSaver total_number_of_writes=1
ProfileSaver total_number_of_code_cache_queries=1
ProfileSaver total_number_of_skipped_writes=0
ProfileSaver total_number_of_failed_writes=0
ProfileSaver total_ms_of_sleep=41067
ProfileSaver total_ms_of_work=7
ProfileSaver max_number_profile_entries_cached=1
ProfileSaver total_number_of_hot_spikes=52
ProfileSaver total_number_of_wake_ups=39suspend all histogram:  Sum: 36.791ms 99% C.I. 1.391us-1505.279us Avg: 164.245us Max: 13683us
DALVIK THREADS (47):
"main" prio=5 tid=1 Runnable| group="main" sCount=0 dsCount=0 flags=0 obj=0x763647d0 self=0x765e2bfa00| sysTid=12909 nice=-4 cgrp=default sched=0/0 handle=0x7662b199b0| state=R schedstat=( 0 0 0 ) utm=1960 stm=107 core=6 HZ=100| stack=0x7ff8ec7000-0x7ff8ec9000 stackSize=8MB| held mutexes= "mutator lock"(shared held)at android.support.v4.view.ViewPager.populate(ViewPager.java:1138)at android.support.v4.view.ViewPager.populate(ViewPager.java:1025)at android.support.v4.view.ViewPager.setPageTransformer(ViewPager.java:712)at com.dch.dai.fragment.home.FeaturedFragment.setTopBannerData(FeaturedFragment.java:521)at com.dch.dai.fragment.home.FeaturedFragment.loadFeaturedData(FeaturedFragment.java:294)at com.dch.dai.fragment.home.FeaturedFragment$2.onPostExecute(FeaturedFragment.java:256)at com.dch.dai.utils.http.MyAsyncTask.onPostExecute(MyAsyncTask.java:38)at com.dch.dai.utils.http.MyAsyncTask.onPostExecute(MyAsyncTask.java:9)at android.os.AsyncTask.finish(AsyncTask.java:695)at android.os.AsyncTask.-wrap1(AsyncTask.java:-1)at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712)at android.os.Handler.dispatchMessage(Handler.java:105)at android.os.Looper.loop(Looper.java:164)at android.app.ActivityThread.main(ActivityThread.java:6665)at java.lang.reflect.Method.invoke(Native method)at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781).....省略

1、搜索[ Cmd line: ]查看进程,找到自己的APP

这里写图片描述

2、搜索 [ “main” prio ] 查看主线程,找到出问题的代码位置

这里写图片描述

这里写图片描述

3、分析原因:

原因:setCurrentItem时,主线程测量滑动距离,绘制UI阻塞

解决:把viewpager的item数量设置小一点即可

mViewPager.setCurrentItem(homeTopBannerData.size() * 100);

参考:ViewPager无限滑动

trace.txt部分解释:

—– pid 19493 at 2017-12-06 15:37:40 —–
Cmd line: com.dch.loan
Build fingerprint: ‘HUAWEI/PIC-AL00/HWPIC:7.0/HUAWEIPIC-AL00/C00B173:user/release-keys’

发生ANR的进程id、时间和进程名称。线程的基本信息:
其中 tll 、 tsl、 tscl 、ghl 、 hwl 、 hwll分别对应:
thread list lock, 
thread suspend lock, 
thread suspend count lock, 
gc heap lock, 
heap worker lock,
heap worker list lock

“main” prio=5 tid=1 Native

线程名称、线程的优先级、线程锁id和线程状态。线程名称是启动线程的时候手动指明的,
这里的main标识是主线程,是Android自动设定的一个线程名称,如果是自己手动创建的线程,
一般会被命名成“Thread-xx”的格式,其中xx是线程id,它只增不减不会被复用;
注意这其中的tid不是线程的id,它是一个在Java虚拟机中用来实现线程锁的变量,随着线程的增减,这个变量的值是可能被复用的

group=”main” sCount=1 dsCount=0 obj=0x77020b18 self=0x78616a1a00

group是线程组名称。
sCount是此线程被挂起的次数,
dsCount是线程被调试器挂起的次数,
当一个进程被调试后,sCount会重置为0,调试完毕后sCount会根据是否被正常挂起增长,
但是dsCount不会被重置为0,所以dsCount也可以用来判断这个线程是否被调试过。
obj表示这个线程的Java对象的地址,
self表示这个线程本身的地址。

sysTid=19493 nice=-4 cgrp=default sched=1073741825/1 handle=0x78657cfa98

线程的调度信息
sysTid是Linux下的内核线程id,
nice是线程的调度优先级,
sched分别标志了线程的调度策略和优先级,
cgrp是调度属组,
handle是线程的处理函数地址。

state=S schedstat=( 9706803631 140093705 7027 ) utm=800 stm=170 core=4 HZ=100
“`
线程当前上下文信息
state是调度状态;
schedstat从/proc/[pid]/task/[tid]/schedstat读出,三个值分别表示线程在cpu上执行的时间、线程的等待时间和线程执行的时间片长度,
有的android内核版本不支持这项信息,得到的三个值都是0;
utm是线程用户态下使用的时间值(单位是jiffies);
stm是内核态下的调度时间值;
core是最后执行这个线程的cpu核的序号。

其他:线程的调用栈信息


http://chatgpt.dhexx.cn/article/OFEZxd0E.shtml

相关文章

对GridView、DetailsView 和 FormView 控件分页属性的PagerSettings类的设置

如果想让分页导航加上图片形式或比如上一页下一页,这种样式,那就要在<GridView>写在这里面</GridView>控件中加上<PagerSettings></PagerSettings>,例如:<PagerSettings Mode="NextPreviousFirstLast" FirstPageText="首页"…

ViewPager + GridView实现GridView分页

概述 通过ViewPager实现GridView的分页 实现 ViewPager通过设置PagerAdapter实现分页。每一页的布局是一个GridView。GridView通过设置自己adapter渲染GridView。 ViewPager&#xff1a;分页器。 GridViewPageAdapter&#xff1a;继承自PagerAdapter。ViewPager的适配器。 Gr…

非常实用的GridView.PagerTemplate 属性

获取或设置 GridView 控件中页导航行的自定义内容。 命名空间:System.Web.UI.WebControls程序集:System.Web&#xff08;在 system.web.dll 中&#xff09; 语法&#xff1a;C# [TemplateContainerAttribute( typeof (GridViewRow))] public virtual ITemplate PagerTempla…

ViewPager的PagerAdapter中的notifyDataSetChanged更新数据总结

最近在工作中遇到了一个问题&#xff0c;就是在viewpager中调用pageradapter.notifydatasetchanged方法&#xff0c;好像没有任何效果&#xff0c;相应的view也没有更新数据&#xff0c;根据官方API是这样解释的&#xff1a;大概是说明Adapter会自动管辖ViewPager每一页(Item)的…

GridView1_PageIndexChanging 分页

//这里点击页面会报错所以要写这个 然后从新刷新一下 可以调一下属性什么的 this.GridView1.PageIndex e.NewPageIndex;jiazai(); c#后台写弹窗 跳转 Response.Write("<script>alert(修改成功);window.location.hrefhttp://localhost:65390/%E6%88%BF%E5%B1…

ViewPager控件之PagerAdapter适配器

一、ViewPager的基本用法 1、简介 ViewPager可以实现多个界面的左右滑动。ViewPager最典型的应用场景主要包 括引导页导航&#xff0c;轮转广告和页面菜单。 ViewPager最早出自4.0版本,为了兼容低版本安卓设备&#xff0c;谷歌官方给我们提供了 一个的软件包android.support.v4…

ViewPager onPageChangeListener总结

android ViewPager滑动事件讲解 今天在做项目的时候&#xff0c;由于要处理viewPager页面滑动的事件&#xff0c;所以对其进行了一个小小的研究&#xff1a; 首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageChangeListener这个接口需要实现三个方法&am…

ViewPager onPageChangeListener总结

android ViewPager滑动事件讲解 今天在做项目的时候&#xff0c;由于要处理viewPager页面滑动的事件&#xff0c;所以对其进行了一个小小的研究&#xff1a; 首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageChangeListener这个接口需要实现三个方法&#…

iscsi命令

iscsi客户端命令 iscsiadm 1.发现target设备 iscsiadm -m discovery -t sendtargets -p 10.12.22.61 疑问&#xff1a;10.12.22.60&#xff1a;3260&#xff0c;1 1表示什么意思(表示portal group tag,参考补充资料1)&#xff0c;此外&#xff0c;为什么连同ip为60的信息…

iSCSI 协议

iSCSI 协议 iSCSI协议结构 如同任何一个协议一样&#xff0c;iSCSI也有一个清晰的层次结构&#xff0c;根据OSI模型&#xff0c;iSCSI的协议栈自顶向下一共可以分为五层&#xff0c;如图所示&#xff1a; SCSI层&#xff1a;根据应用发出的请求建立SCSI CDB(命令描述块)&…

Linux与ISCSI

ISCSI&#xff08;Internet Small Computer System Interface&#xff09;:Internet 小型计算机系统接口&#xff0c;是一个基于 TCP/IP 的协 议&#xff0c;主要用于通过 IP 网络仿真 SCSI&#xff0c;从而为远程块存储设备提供数据传输和管理。说白了&#xff0c;就是通过 网…

ISCSI服务

Internet Small Computer System Interface:Internet 小型计算机系统接口&#xff0c;是一个基于 TCP/IP 的协 议&#xff0c;主要用于通过 IP 网络仿真 SCSI&#xff0c;从而为远程块存储设备提供数据传输和管理。说白了&#xff0c;就是通过 网络由专门的服务器提供存储管理&…

iSCSI 网络磁盘共享

17.1 iSCSI技术介绍 iSCSI技术实现了物理硬盘设备与TCP/TP网络传输协议的相互结合&#xff0c;使得用户可以通过互联网方便的获取到远程机房提供的共享存储资源 硬盘是计算机硬件设备中重要的组成部分之一&#xff0c;存储设备的IO读写速度快慢也直接影响着服务器整体性能的高…

ISCSI的部署与安装

iSCSI&#xff08;Internet Small Computer System Interface&#xff0c;Internet小型计算机系统接口&#xff09;是一种由IBM公司研究开发的IP SAN技术。 该技术是将现有SCSI接口与以太网络(Ethernet)技术结合&#xff0c;基于 TCP/IP的协议连接iSCSI服务端&#xff08;Targe…

SCSI协议与iSCSI协议

文章目录 1.SCSI协议2.iSCSI协议3.IO--SCSI错误处理机制 1.SCSI协议 SCSI的起源 SCSI出现的原因主要是因为原来的IDE接口的硬盘转速太慢&#xff0c;传输速率太低&#xff0c;因此高速的SCSI硬盘出现。其实SCSI并不是专为硬盘设计的&#xff0c;实际上它是一种总线型接口。由…

ISCSI详解(三)——ISCSI原理和架构

今天继续给大家介绍Linux运维相关知识&#xff0c;本文主要内容是ISCSI基础知识。 一、ISCSI架构 ISCSI的架构主要有以下两种&#xff1a; 1、控制器架构 在控制器架构下&#xff0c;ISCSI使用专门的数据传输芯片&#xff0c;专门的RAID数据校验芯片、高性能的cache缓存以及专…

iscsi服务器搭建

iscsi搭建 ISCSI服务介绍服务器配置&#xff08;IP:192.168.155.28&#xff09;客户端配置Linux&#xff08;IP:192.168.155.30&#xff09;Windows配置&#xff08;192.168.155.200&#xff09; ISCSI服务介绍 全称&#xff1a;Internet Small Computer System Interface——…

Windows iSCSI

iSCSI 题目一、安装iSCSI并创建存储位置二、配置iSCSI三、DC1连接iSCSI四、创建盘提示:若需要问题欢迎私聊‘ 题目 iSCSI 磁盘存储在D:\ISCSIDATA 中; iSCSI 磁盘提供给DC1 使用,磁盘容量500 G,启用chap 验证; DC1 上连接成功后,把磁盘格式化为NTFS 格式并挂载到卷标D …

【基于CentOS 7 的iscsi服务】

目录 一、概述 1.简述 2.作用 3. iscsi 4.相关名称 二、使用步骤 - 构建iscsi服务 1.使用targetcli工具进入到iscsi服务器端管理界面 2.实现步骤 2.1 服务器端 2.2 客户端 2.2.1 安装软件 2.2.2 在认证文件中生成iqn编号 2.2.3 开启客户端服务 2.2.4 查找可用的i…

ISCSI服务器搭建与配置

ISCSI服务简介 ISCSI简介&#xff1a; iSCSI( Internet Small Computer System Interface 互联网小型计算机系统接口) 技术是一种新存储技术&#xff0c;该技术是将现有的SCSI接口与以太网技术相结合&#xff0c;使服务器可与使用IP网络的存储装置互相交换资料。 iscsi 结构…