热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于Android中一些异常问题的解决办法

Top-levelbuildfilewhereyoucanaddconfigurationoptionscommontoallsub-projectsmodules.b
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}


allprojects {
    repositories {
        jcenter()
    }
}
---------------------------------------------------------------------------------------------------------------------


问题总结

1、
在使用AndroidStudio导入项目后,提示图片错误问题,原因是当前AS版本和之前项目版本有差异,根据网络资料,
最新的ADT在AS中必须要使用.9.png图片,解决办法就有两种:
错误:9.png Error:Must have one-pixel frame that is either transparent or white. -xxx/app/src/main/res/drawable-


xhdpi/icon_addpic_focused.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited
解决办法一:修改图片名称为.9.png
解决办法二:到build.grade文件中修改
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
}
将classpath 'com.android.tools.build:gradle:1.5.0'的版本改为之前项目的版本,手动修改,比如1.2.3


--------------------------------------------------------------------------------------------------------------------

2、
网络获取图片提示eftexception,参考网络未得到解决
提示nofoundfile原因假如在运行时异常而调试状态下正常,
尝试使用延时处理,和对个任务,线程相关,另外是针对具体项目的逻辑处理考虑因素。
同步轮播显示视图方案:
(1) 同步时刻采用对具体的position设置对应的延时,比如position = 1,延时为1000,position = 2,延时为2000,依次类推。
(2) 采用广播,在listview的可视区域获取相应的view,通过getTag拿取到对应的viewHolder对象,而后进行加载显示。


---------------------------------------------------------------------------------------------------------------------

3、
从一个Activity的某个Fragment跳转到下一个Activity,退栈返回时可能会出现状态被保留,显示了之前的数据后才重新显示正常
正确的数据,原因是和生命周期有关
解决办法为在Fragment的生命周期onStart或者onResume中才做显示控件的数据赋值,具体请看生命周期。该种办法有时候不行,根据具体的逻辑处理看。


-----------------------------------------------------------------------------------------------------------------------------


----------------------------------------

3、

异常错误显示:


07-20 11:30:47.528: E/InputEventReceiver(15683): Exception dispatching input event.
07-20 11:30:47.528: E/MessageQueue-JNI(15683): Exception in MessageQueue callback: handleReceiveCallback
07-20 11:30:47.558: E/MessageQueue-JNI(15683): java.lang.IllegalStateException: The content of the adapter has changed but 


ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but 


only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView


(2131362029, class android.widget.ListView) with Adapter(class com.apical.aiproforremote.adapter.LoadQueueAdapter)]
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.widget.ListView.layoutChildren(ListView.java:1555)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.widget.AbsListView.onTouchMove(AbsListView.java:3696)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3552)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.View.dispatchTouchEvent(View.java:7731)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2212)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.widget.AbsListView.dispatchTouchEvent(AbsListView.java:930)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at com.android.internal.policy.impl.PhoneWindow


$DecorView.superDispatchTouchEvent(PhoneWindow.java:2242)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent


(PhoneWindow.java:1536)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.app.Activity.dispatchTouchEvent(Activity.java:2501)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent


(PhoneWindow.java:2190)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.View.dispatchPointerEvent(View.java:7911)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent


(ViewRootImpl.java:4041)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess


(ViewRootImpl.java:3920)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3481)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$InputStage.onDeliverToNext


(ViewRootImpl.java:3531)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3500)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3607)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3508)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3664)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3481)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$InputStage.onDeliverToNext


(ViewRootImpl.java:3531)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3500)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3508)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3481)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5629)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5606)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5577)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent


(ViewRootImpl.java:5773)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.view.InputEventReceiver.dispatchInputEvent


(InputEventReceiver.java:185)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.os.MessageQueue.nativePollOnce(Native Method)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.os.MessageQueue.next(MessageQueue.java:138)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.os.Looper.loop(Looper.java:123)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at android.app.ActivityThread.main(ActivityThread.java:5128)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at java.lang.reflect.Method.invokeNative(Native Method)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at java.lang.reflect.Method.invoke(Method.java:515)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run


(ZygoteInit.java:893)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)
07-20 11:30:47.558: E/MessageQueue-JNI(15683): at dalvik.system.NativeStart.main(Native Method)
07-20 11:30:47.878: E/TestinAgent(15683): ****************************************


该异常出现情况的前提操作:


使用listview做下载队列,首个Item显示有进度条等内容,其余为等待状态,通过广播对数据集做remove操作,并紧接着使用


notifyDataSetChanged刷新适配器。在手势操作,滚动
listview的时候突显这个异常,造成程序崩溃。


通过异常提示内容:线程不是在UI,排除,确定项目中更新在UI中进行。数据集移除直接刷新,应该不会有问题,适配器没有收到数据集改变


的通知,可能数据集指向的内存不是一个,
也排除,适配器中的list用的同一个。


提示中有view的事件传递机制,以及该异常是因为手势操作情况下产生,推测是事件相关,通过监听listview的滚动事件和手势事件,初步解决。


通过监听ListView滚动事件以及手势事件解决办法:


1、定义一个变量用于记录当前是否在滚动中:public boolean isListViewScrolling = false;


2、监听事件:   download_queue_list.setAdapter(loadQueueAdapter);
download_queue_list.setOnScrollListener(new ScrollListenerForListView());
download_queue_list.setOnTouchListener(new GestrueTouchEventListener(this));


3、对应的事件类:private class ScrollListenerForListView implements AbsListView.OnScrollListener{

@Override
public void onScroll(AbsListView paramAbsListView, int firstVisibleItem, int visibleItemCount, int 


totalItemCounts) {
// TODO Auto-generated method stub
total = totalItemCounts;
Log.d("--DownloadQueueActivity--", "--ScrollListenerForListView--" + " totalItemCounts = " + 


totalItemCounts
+ " , loadQueueAdapter.totalItemCount = " + loadQueueAdapter.totalItemCount 
+ " , loadQueueAdapter.removedTotalItemCount = " + 


loadQueueAdapter.removedTotalItemCount);
if ((loadQueueAdapter.removedTotalItemCount != loadQueueAdapter.totalItemCount) ){
loadQueueAdapter.notifyDataSetChanged();
}
}


@Override
public void onScrollStateChanged(AbsListView paramAbsListView, int paramIntStatus) {
// TODO Auto-generated method stub
loadQueueAdapter.isListViewScrolling = true;

if (paramIntStatus == OnScrollListener.SCROLL_STATE_FLING){// ->2
loadQueueAdapter.isListViewScrolling = true;

Log.d("--DownloadQueueActivity--", "--ScrollListenerForListView--2-->" 
+ " , loadQueueAdapter.totalItemCount = " + loadQueueAdapter.totalItemCount 
+ " , loadQueueAdapter.removedTotalItemCount = " + 


loadQueueAdapter.removedTotalItemCount);

if (loadQueueAdapter.removedTotalItemCount != loadQueueAdapter.totalItemCount){
loadQueueAdapter.notifyDataSetChanged();
}

} else if (paramIntStatus == OnScrollListener.SCROLL_STATE_IDLE){// ->0
loadQueueAdapter.isListViewScrolling = false;
loadQueueAdapter.removeDataFromListAgain();

Log.d("--DownloadQueueActivity--", "--ScrollListenerForListView--0-->" 
+ " , loadQueueAdapter.totalItemCount = " + loadQueueAdapter.totalItemCount 
+ " , loadQueueAdapter.removedTotalItemCount = " + 


loadQueueAdapter.removedTotalItemCount);

if ((loadQueueAdapter.removedTotalItemCount != loadQueueAdapter.totalItemCount) ){
loadQueueAdapter.notifyDataSetChanged();
}

int visibleFirstPositiOnInListView= download_queue_list.getFirstVisiblePosition();
if (visibleFirstPositiOnInListView== 0){
View view = download_queue_list.getChildAt(0);
if (view == null)
return;
ViewHolder viewHolder = (ViewHolder) view.getTag();

viewHolder.progressbar_load_queue_file_right.setMax(Application.downloadMaxProgress);
viewHolder.progressbar_load_queue_file_right.setProgress


(Application.downloadProgressStep);
viewHolder.text_load_queue_file_info_id.setText(Application.downloadProgressStep + 


"/" + Application.downloadMaxProgress);
}

} else if (paramIntStatus == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){// ->1
loadQueueAdapter.isListViewScrolling = true;

Log.d("--DownloadQueueActivity--", "--ScrollListenerForListView--1-->" 
+ " , loadQueueAdapter.totalItemCount = " + loadQueueAdapter.totalItemCount 
+ " , loadQueueAdapter.removedTotalItemCount = " + 


loadQueueAdapter.removedTotalItemCount);

if ((loadQueueAdapter.removedTotalItemCount != loadQueueAdapter.totalItemCount) ){
loadQueueAdapter.notifyDataSetChanged();
}

}


}

}

private class GestrueTouchEventListener implements OnGestureListener, OnTouchListener{
GestureDetector mGestureDetector = null;
Context context;

@SuppressWarnings("deprecation")
public GestrueTouchEventListener(Context context){
this.cOntext= context;
mGestureDetector = new GestureDetector(this);
}

@Override
public boolean onDown(MotionEvent arg0) {
// TODO Auto-generated method stub
loadQueueAdapter.isListViewScrolling = true;
return false;
}


@Override
public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
float arg3) {
// TODO Auto-generated method stub
loadQueueAdapter.isListViewScrolling = true;
return false;
}


@Override
public void onLongPress(MotionEvent arg0) {
// TODO Auto-generated method stub
loadQueueAdapter.isListViewScrolling = true;
}


@Override
public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
float arg3) {
// TODO Auto-generated method stub
loadQueueAdapter.isListViewScrolling = true;


return false;
}


@Override
public void onShowPress(MotionEvent arg0) {
// TODO Auto-generated method stub
loadQueueAdapter.isListViewScrolling = true;
}


@Override
public boolean onSingleTapUp(MotionEvent arg0) {
// TODO Auto-generated method stub
loadQueueAdapter.isListViewScrolling = true;
return false;
}


@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
return  mGestureDetector.onTouchEvent(event);
//return false;
}

}


4、在适配器中移除数据项的处理:如果滚动就先做保存,当不滚动的时候再做移除,如上面滚动事件类代码中


loadQueueAdapter.removeDataFromListAgain();。
 
   具体有:public void removeDataFromList(int item){

if (list.size() > 0){
if (isListViewScrolling){
countItemDownloaded++;
laterList.add(item);
return;
} else {
removeDataFromListAgain();
}

if (activity_flag == DOWN_ACTIVITY_FLAG){
list.remove(item);
notifyDataSetChanged();
removedTotalItemCount = list.size();

……

} else if (activity_flag == UP_ACTIVITY_FLAG){
list.remove(item);
notifyDataSetChanged();


……
}
} else {
list = new ArrayList();
notifyDataSetChanged();
}
}




         public void removeDataFromListAgain(){
if (!(countItemDownloaded > 0)){
return ;
}
if (list.size() > 0){
for (int i = 0; i int item = laterList.get(i);
list.remove(item);
notifyDataSetChanged();


                                ……
这种做法的弊端:——可以大致地解决异常冲突,但是存在几个弊端
1、用户操作不规范,有些动作有可能依旧会报出该问题
2、等到不滚动时做移除数据,有可能造成视觉上的错误,突然不见很多Item,或者第一项的进度条分明已经走到最大,
又从头开始但是下载的文件名称还保留着上一个的,可以说,这种办法引起的这个问题,已经算得上是一个BUG,我们
还需要对这种情况进行一些处理,暂时想到的办法为隐藏视图,没有继续尝试,心里感觉这种解决不可行。


解决这个冲突的另一种方案:


使用一个ScrollView嵌套Listview,当然需要自定义ListView使其能够不会和ScrollView产生事件冲突,方法网上有很多。
这样滚动的事件就不是ListView,那么就不会存在正发生着滚动事件和数据项移除没完成notifyDataSetChangedded的情况了。
本方法验证可行。这种方法存在的弊端有可能造成ListView自定义适配器的复用不再有用。
具体的情况还需要根据业务和代码来进行分析和解决。




                












推荐阅读
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • 1简介本文结合数字信号处理课程和Matlab程序设计课程的相关知识,给出了基于Matlab的音乐播放器的总体设计方案,介绍了播放器主要模块的功能,设计与实现方法.我们将该设 ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • RabbitMq之发布确认高级部分1.为什么会需要发布确认高级部分?在生产环境中由于一些不明原因,导致rabbitmq重启,在RabbitMQ重启期间生产者消息投递失败,导致消息丢 ... [详细]
  • 开发笔记:图像识别基于主成分分析算法实现人脸二维码识别
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了图像识别基于主成分分析算法实现人脸二维码识别相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 我正在尝试使用scrapycrallsingle运行完美运行的scrapy蜘蛛,但我无法在python脚本中运行它.主要问题是从不执行SingleBlogSpider.parse方 ... [详细]
  • 时域|波形_语音处理基于matlab GUI音频数据处理含Matlab源码 1734期
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了语音处理基于matlabGUI音频数据处理含Matlab源码1734期相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
回忆寒窗氵之夜_890
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有