头疼的IllegalArgumentException
在Android开发的过程中,涉及到与UI相关的操作只能在主线程执行,否则就会抛出以下异常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
当然这属于基本常识,也不是本文讨论的重点,但后续的所有讨论都围绕这一基本常识进行。在开发Android应用时,如果所有的代码都在主线程执行,很容易就会出现ANR,并且Android在4.0以后已经禁止在主线程中执行网络请求,因此或多或少地需要与多线程打交道。无论是使用当前热火朝天的OkHttp(Retrofit),还是使用过时的Volley或者Android-Async-Http,它们都支持异步请求。这些异步请求的请求流程一般如下:
主线程发起请求
->网络框架开启工作线程进行网络请求
->工作线程拿到请求结果
->将请求结果通过Handler返回主线程
->主线程更新UI,完成一次网络请求
这个流程看似正常,实则暗含危机。下面的崩溃就是其中一个例子。
java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{24e9c19a V.E..... R......D 0,0-1026,348} not attached to window manager
at android.view.WindowManagerGlobal.findViewLock
头疼的IllegalArgumentException在Android开发的过程中,涉及到与UI相关的操作只能在主线程执行,否则就会抛出以下异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its view...
android
:id="@+id/image
view
"
android
:layout_width="wrap_content"
android
:layout_height="wrap_content"
androi
Android
中,可以通过以下步骤实现
Activity
跳转
Fragment
:
1. 在
Activity
中,使用
Fragment
Manager获取
Fragment
Transaction对象。
2. 使用
Fragment
Transaction对象的add()方法添加要跳转的
Fragment
。
3. 使用
Fragment
Transaction对象的commit()方法提交事务,完成
Fragment
的添加。
4. 在
Fragment
中,可以通过get
Activity
()方法获取当前所在的
Activity
对象,从而实现
Activity
与
Fragment
之间的交互。
需要注意的是,
Fragment
的添加必须在
Activity
的onCreate()方法中进行,否则会出现异常。同
时
,为了避免
Fragment
重叠的问题,建议使用replace()方法替换
Fragment
,而不是add()方法添加
Fragment
。