Android
sunpeng0822
这个作者很懒,什么都没留下…
展开
-
抛ConcurrentModificationException原因以及解决方案
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException();}即当modCount != expectedModCount时,执行next()就会抛出ConcurrentModificatio原创 2016-06-07 15:13:06 · 174 阅读 · 0 评论 -
ListView内部调用了requestDisallowInterceptTouchEvent(true)
经过试验,得知,如果ListView外部套用了ViewGroup,而ViewGroup不拦截任何事件,那么对于同一个事件序列,每一次事件到来理论上来说应该都会调用ViewGroup的onInterceptTouchEvent方法,但是事实并不是这样,一般只在ACTION_DOWN跟几个ACTION_MOVE到来的时候调用,而后序的ACTION_MOVE跟ACTION_UP不会调用onInterce原创 2016-06-07 15:38:20 · 152 阅读 · 0 评论 -
关于mFirstTouchTarget
对于一个事件序列,如果ViewGroup不拦截ACTION_DOWN,而子View处理了这个ACTION_DOWN事件,但是后面ViewGroup拦截了某个ACTION_MOVE,那么mFirstTouchTarget会被置为Null,也就是说后面不会询问ViewGroup是否会拦截后面的事件序列,而是直接交给它处理。原创 2016-06-07 15:39:01 · 238 阅读 · 1 评论 -
关于scrollTo方法
View调用scrollTo方法,实际上调用的是OnScrollChangeListener.onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY),来改变View内容的水平跟垂直位置,这个接口可以通过public void setOnScrollChangeListener(OnScro原创 2016-06-07 15:39:58 · 208 阅读 · 0 评论 -
String,StringBuffer,StringBuilder
String:当改变一个String对象a的值时,会重新new一个String对象,然后把a的引用指向新的String对象。StringBuffer:当改变StringBuffer对象a的值时,不会重新new,而是直接改变a引用里面的值。是线程同步的。StringBuilder:类似StringBuffer,但是不是线程同步的。注意:是不是String也不安全呢?事实上不存在这个问原创 2016-06-07 15:41:45 · 189 阅读 · 0 评论 -
RemoteViews
RemoteViews在实际开发中,主要用于在通知栏和桌面小部件的开发过程中。通知栏主要是通过NotificationManager的notify方法来实现,它除了默认效果外,还可以另外定义布局。桌面小部件则是通过AppWidgetProvider来实现的,AppWidgetProvider本质上是一个广播。通知栏和桌面小部件的开发过程中都会用到RemoteViews,它们原创 2016-06-07 16:03:30 · 278 阅读 · 0 评论 -
关于scrollBy
scrollBy是基于View的当前位置去滑动,它调用的还是scrollTo方法。源码如下:public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }其中mScrollX,mScrollY是View的当前位置。原创 2016-06-07 16:13:30 · 166 阅读 · 0 评论 -
View滑动冲突的处理
常见的滑动冲突可以分为三种:一、外部滑动方向和内部滑动方向不一致,比如ViewPager嵌套ListView,之所以我们使用起来没问题是因为ViewPager内部已经处理过了,这里只是拿来举个例子。二、外部滑动方向和内部滑动方向一致,比如ScrollView嵌套ListView,我们用的时候没问题也是因为ScrollView内部已经处理了。三、上面两种情况的嵌套。对于第原创 2016-06-10 14:57:45 · 331 阅读 · 0 评论 -
View的事件传递机制
先说两个重要的概念:1.同一时间序列事件序列:即手指触摸屏幕产生ACTION_DOWN开始,其中包含不定数量的ACTION_MOVE等,以ACTION_UP结束,即手指离开屏幕那一刻。这就是一个事件序列。2.事件的传递顺序:当一个点击操作产生之后,事件最先传递给当前的Activity,由Activity的dispatchTouchEvent来进行事件的分发,具体的工作是由Activity内原创 2016-06-10 14:57:04 · 496 阅读 · 0 评论 -
让PopWindow弹出在某个View的正上方
刚开始看的时候,以为使用showAsDropDown (View anchor, int xoff, int yoff, int gravity)通过设置gravity就行,可是试了一下不管用,只有Gravity.RIGHT这个字段能起作用,就是从anchor的右下角开始弹出。后来只能另外想一个方法,就是通过showAsDropDown(View anchor,int xoff, in原创 2016-07-01 19:14:17 · 1125 阅读 · 0 评论 -
关于线程的下载及接口回调的问题
接口回调不需要Looper,但是 如果需要在子线程中去使用Handler是需要Looper的,使用方法为 Looper.prepare Looper.loop 然后使用完了一定要Looper.myLooper.quit;下载的时候更新主界面的View,如果是在子线程或者子线程的回调接口中去更新主界面的View 会抛出can't touch不是它创建的view异常。但是更新ProgressB原创 2016-06-07 15:34:46 · 247 阅读 · 0 评论 -
线程的锁及线程间的通信
当前线程只有拥有锁对象 ,才能去wait()或者notify()该锁对象上面的线程。如何拿到锁对象:线程中有同步代码,并且以该对象作为同步锁。具体可参考API文档。原创 2016-06-07 15:16:06 · 165 阅读 · 0 评论 -
关于线程的下载及接口回调的问题
接口回调不需要Looper,但是 如果需要在子线程中去使用Handler是需要Looper的,使用方法为 Looper.prepare Looper.loop 然后使用完了一定要Looper.myLooper.quit;下载的时候更新主界面的View,如果是在子线程或者子线程的回调接口中去更新主界面的View 会抛出can't touch不是它创建的view异常。但是更新ProgressB原创 2016-06-07 15:20:26 · 195 阅读 · 0 评论 -
HttpUrlConnection的连接异常
Debug的时候 在conn.setRequestMethod()的时候 会抛出 Connection already established 异常。但是正常运行的时候 不会抛出这个异常,这个问题也很奇怪,目前没有解决。原创 2016-06-07 15:21:17 · 242 阅读 · 0 评论 -
关于Handler的post跟View的post方法。
Handler发送消息的过程仅仅是向消息队列中插入了一条消息,MessagQueue的next方法一会返回这条消息给Looper,Looper收到消息后就开始处理了。最终消息由Looper交由Handler处理,即Handler的dispatchMessage方法会被调用。dispatchMessage方法的源码如下:public void dispatchMessage(Message原创 2016-06-07 15:23:17 · 1552 阅读 · 0 评论 -
关于ProgressBar能在子线程中更新
理论上在子线程中是不能更新UI的,但是ProgressBar却可以。这是因为在 setProgress 的源码中,首先会判断当前线程是否为主UI线程,若是主UI线程则直接调用 doRefreshProgress 方法更新进度;若不是主UI线程则会先创建一个RefreshProgressRunnable 对象,然后调用 view 的 post(Runnable action) 方法,将原创 2016-06-07 15:24:49 · 394 阅读 · 0 评论 -
Android中的线程形态
除了传统的Thread外,还包含AsyncTask,HandlerThread,以及IntentService。1.AsyncTask:封装了线程池和Handler,它主要是为了方便开发者在子线程中更新UI。AsyncTask的类必须在主线程中加载,这就意味着第一次访问AsyncTask必须发生在主线程,当然这个果然在Android4.1及以上版本中已经被系统自动完成。在Android原创 2016-06-07 15:27:40 · 258 阅读 · 0 评论 -
Android中线程池的分类
Android中最常见的四类具有不同功能特性的线程池,它们都直接或间接的通过配置ThreadPoolExecutor来实现自己的功能特性,这四类线程池分别是:FixedThreadPool,CachedThreadPool,ScheduledThreadPool以及SingleThreadPool。1.FixedThreadPool:通过Executors的newFixedThre原创 2016-06-07 15:28:20 · 661 阅读 · 0 评论 -
理解Window和WindowManager
1.Window是一个抽象类,它的具体实现是PhoneWindow。Window是一个抽象概念,每一个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl建立关联。因此Window并不是实际存在的,它是以View的形式存在。2.WindowManager是一个接口,是外界访问Window的入口。它的真正实现是Window原创 2016-06-07 15:30:32 · 292 阅读 · 0 评论 -
Activity的Window创建
Activity的启动最终会由ActivityThread中的perforLaunchActivity()来完成整个启动过程,在这个方法内部会通过类加载器创建Activity的实例对象,并调用其attach方法为其关联运行过程中所依赖的一系列上下文环境变量。在attach方法里,系统会创建Activity所属的Window对象(new了一个PhoneWindow)并为其设置回调接口。由于Act原创 2016-06-07 15:31:03 · 213 阅读 · 0 评论 -
关于Activity的启动过程
1.startActivity有好几种重载,但它们最终都会调用startActivityForResult方法。2.启动Activity真正的实现由ActivityManagerNative.getDefault的startActivity方法来完成。由于ActivityManagerNative.getDefault是一个IActivityManager类型的Binder对象,而原创 2016-06-07 15:32:11 · 243 阅读 · 0 评论 -
Service的启动(startService)
1.在ContextImpl中startService方法会调用startServiceCommon方法,而startServiceCommon方法又会通过ActivityManagerNative.getDefault这个对象来启动一个服务,ActivityManagerNative.getDefault就是AMS。AMS会通过ActivityServices来完成Service的后续启动,Ac原创 2016-06-07 15:33:06 · 430 阅读 · 0 评论 -
ScrollView嵌套ListView,GridView等自动滚动的问题
ScrollView嵌套ListView,GridView,如果这些子控件很长超出了屏幕的高度,那么ScrollView会自动滚到底部,但是我们需要默认在顶部,需要在ListView和GridView上面的view中加入以下代码即可解决:view.setFocusable(true); view.setFocusableInTouchMode(true); view.r原创 2016-08-26 19:09:40 · 386 阅读 · 0 评论