关于ANR报错的一个问题 Reason: keyDispatchingTimedOut

x771792231 2013-12-09 04:25:22
先把Log信息贴出来:
E/ActivityManager( 163): ANR in com.hisense.mediacenter.filemanager (com.hisense.mediacenter.filemanager/.FMEntryActivity)
E/ActivityManager( 163): Reason: keyDispatchingTimedOut
E/ActivityManager( 163): Load: 4.63 / 4.58 / 4.7
E/ActivityManager( 163): CPU usage from 36480ms to 0ms ago:
E/ActivityManager( 163): 8.8% 16504/ntfs-3g: 3.1% user + 5.6% kernel / faults: 1 minor
E/ActivityManager( 163): 12% 1058/com.hisense.mediacenter.filemanager: 7.6% user + 4.4% kernel / faults: 1297 minor 1 major
E/ActivityManager( 163): 1.3% 254/com.amlogic.inputmethod.remote: 1.1% user + 0.1% kernel / faults: 681 minor 8 major
E/ActivityManager( 163): 0.6% 163/system_server: 0.4% user + 0.1% kernel / faults: 58 minor 1 major
E/ActivityManager( 163): 0.5% 321/com.jrm.tm.cpe: 0.3% user + 0.2% kernel / faults: 75 minor
E/ActivityManager( 163): 0.5% 76/surfaceflinger: 0.3% user + 0.1% kernel
E/ActivityManager( 163): 0.3% 31735/com.android.launcher: 0.2% user + 0.1% kernel / faults: 100 minor
E/ActivityManager( 163): 0.3% 87/adbd: 0% user + 0.3% kernel
E/ActivityManager( 163): 0.2% 56/kthread_hdmi: 0% user + 0.2% kernel
E/ActivityManager( 163): 0.1% 1597/logcat: 0% user + 0.1% kernel
E/ActivityManager( 163): 0.1% 5/events/0: 0% user + 0.1% kernel
E/ActivityManager( 163): 0% 52/kthread_di: 0% user + 0% kernel
E/ActivityManager( 163): 0% 16480/usb-storage: 0% user + 0% kernel
E/ActivityManager( 163): 0% 32709/com.hisense.systemupdate: 0% user + 0% kernel / faults: 4 minor
E/ActivityManager( 163): 0% 3/ksoftirqd/0: 0% user + 0% kernel
E/ActivityManager( 163): 0% 54/card_read_monit: 0% user + 0% kernel
E/ActivityManager( 163): 0% 60/mali/0: 0% user + 0% kernel
E/ActivityManager( 163): 0% 460/com.farcore.videoplayer: 0% user + 0% kernel
E/ActivityManager( 163): 0% 26941/com.android.weather: 0% user + 0% kernel
E/ActivityManager( 163): 30% TOTAL: 15% user + 14% kernel + 1.3% iowait + 0% irq + 0% softirq
E/ActivityManager( 163): CPU usage from 616ms to 1140ms later:
E/ActivityManager( 163): 67% 16504/ntfs-3g: 23% user + 44% kernel
E/ActivityManager( 163): 28% 1058/com.hisense.mediacenter.filemanager: 7.6% user + 21% kernel / faults: 5 minor
E/ActivityManager( 163): 25% 1058/ter.filemanager: 5.7% user + 19% kernel
E/ActivityManager( 163): 1.9% 1075/AsyncTask #1: 0% user + 1.9% kernel
E/ActivityManager( 163): 3.8% 163/system_server: 1.9% user + 1.9% kernel / faults: 2 minor
E/ActivityManager( 163): 5.7% 194/InputDispatcher: 1.9% user + 3.8% kernel
E/ActivityManager( 163): 1.9% 195/InputReader: 0% user + 1.9% kernel
E/ActivityManager( 163): 1.5% 31735/com.android.launcher: 1.5% user + 0% kernel / faults: 2 minor
E/ActivityManager( 163): 3.1% 31755/Thread-464: 3.1% user + 0% kernel
E/ActivityManager( 163): 100% TOTAL: 33% user + 66% kernel

/anr/Traces.txt 主要内容如下:

Cmd line: com.android.systemui

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40a46460 self=0x12818
| sysTid=270 nice=0 sched=0/0 cgrp=default handle=1074083080
| schedstat=( 1517282000 4299224000 619 ) utm=120 stm=31 core=0
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:118)
at android.os.Looper.loop(Looper.java:118)
at android.app.ActivityThread.main(ActivityThread.java:4429)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)

问题描述:问题主要是文件夹内的文件搜索功能,在一个数据量特别大的文件内(500G)搜索某个文件,如果只输入一个字母就开始搜索,则会搜出包含该字母的所有文件(数量特别庞大),并且死机然后ANR报错。如果精确一点搜某个文件,也就是说,搜出的结果数量少的话就不会出现这种状况。
搜索功能实现用了AsyncTask异步处理类实现的。
现在就是搞不明白到底是什么原因,主线程阻塞?文件显示数据量庞大时应该分页显示?请大家帮我分析一下,初学安卓,才疏学浅啊!
...全文
1931 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
x771792231 2013-12-10
  • 打赏
  • 举报
回复
谢谢,按键响应肯定放在主线程,搜索的过程肯定放在子线程,更新当前UI(就是将搜索到的文件罗列出来)也必须放在主线程,我都是这么做的,可还是出了问题,纠结啊。
猿来这样 2013-12-09
  • 打赏
  • 举报
回复
LZ是不是发错贴了,这是java区。不过ANR应该是数据量加载太大,按下一个键开始搜索,这时会加载很大的数据,如果这个时候没有加载完,再按下另一个键,这个时候在同一个处理线程中,所以得等待,这样就超过了android的响应时间,出现ANR异常,建议LZ可以适当的设置搜索词长,或者按键响应和加载处理分开不同的线程,但数据量大简单的搜索也不保证一定能行
x771792231 2013-12-09
  • 打赏
  • 举报
回复
把相关代码也贴出来吧: private class SearchAsyncTask extends AsyncTask<FilesDisplayItemData, FilesDisplayItemData, List<FilesDisplayItemData>>{ private boolean progressing = false; private final long TIMING =2000; Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(progressing){ mFilesDisplayManager.setDisplayContent(progressResultList, true); Log.d(TAG, "handleMessage"); } } }; public void search(FilesDisplayItemData[] arrData){ onSearching = true; onSearchingFinished = false; this.execute(arrData); } public void searchInResult(){ onSearchingFinished = false; this.execute(new FilesDisplayItemData[0]); } public void stop(){ progressing = false; } @Override protected void onPreExecute() { super.onPreExecute(); progressing = true; progressResultList = new ArrayList<FilesDisplayItemData>(); mFilesDisplayManager.setDisplayContent(progressResultList, true); new Thread(){ @Override public void run() { super.run(); while(progressing){ handler.sendEmptyMessage(0); try { sleep(TIMING); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); if(mListener != null){ mListener.onSearchStarted(); } } @Override protected List<FilesDisplayItemData> doInBackground(FilesDisplayItemData... params) { List<FilesDisplayItemData> resultList = null; //search all if(params.length != 0){ if(params[0].getType().equals(DataType.NATIVE)){ resultList = new ArrayList<FilesDisplayItemData>(); for(FilesDisplayItemData itemData : params){ List<ExtendedFile> eFileList = this.filesSearchAll(new ExtendedFile(new File(itemData.getUri().getPath())), inputContent); for(ExtendedFile eFile : eFileList){ FilesDisplayItemData item = new FilesDisplayItemDataNative(eFile.getmFile()); item.setSourceType(itemData.getSourceType()); resultList.add(item); } } } else if(params[0].getType().equals(DataType.NET)){ //codes handling net sources } } //search in result else{ resultList = this.filesSearchFromResult(searchResultList, inputContent); } return resultList; } //onPostExecute方法运行在主线程中,所以可以更新UI //doInBackground()返回的结果作为onPostExecute的参数 @Override protected void onPostExecute(List<FilesDisplayItemData> result) { super.onPostExecute(result); onSearchingFinished = true; for(FilesDisplayItemData item : result){ Log.d(TAG, "item.getTitle() = "+item.getTitle()); } progressing = false; searchResultList = result; mFilesDisplayManager.setDisplayContent(searchResultList, true); if(mListener != null){ mListener.onSearchFinished(); } } private List<FilesDisplayItemData> filesSearchFromResult(final List<FilesDisplayItemData> list, String keyword){ if((list==null) || keyword==null) return null; ArrayList<FilesDisplayItemData> resultList = new ArrayList<FilesDisplayItemData>(); for(FilesDisplayItemData itemData : searchResultList){ if(itemData.getTitle().toLowerCase().contains(keyword.toLowerCase()) || Util.getFirstPinYin(itemData.getTitle()).toLowerCase().contains(keyword.toLowerCase())){ resultList.add(itemData); } } return resultList; } private List<ExtendedFile> filesSearchAll(ExtendedFile eFileDir, String keyword){ if((eFileDir==null) || !(FileType.Type.Directory.equals(eFileDir.getmType())) || (keyword==null)) return null; ArrayList<ExtendedFile> resultList = new ArrayList<ExtendedFile>(); searchAll(resultList, eFileDir.getmFile(), keyword); return resultList; } private void searchAll(ArrayList<ExtendedFile> list, File fileDir, String keyword){ File[] files = fileDir.listFiles(); if(files == null) return; for(File f : files){ if(!this.progressing) break; if((f.getName().toLowerCase()).contains(keyword.toLowerCase()) || Util.getFirstPinYin(f.getName()).toLowerCase().contains(keyword.toLowerCase())){ list.add(new ExtendedFile(f)); if(this.progressing){ FilesDisplayItemDataNative t = new FilesDisplayItemDataNative(f); progressResultList.add(t); searchResultList.add(t); } } if(f.isDirectory()){ searchAll(list, f, keyword); } } } }

13,097

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧