相关文章推荐
胆小的青椒  ·  linux报错 find: missing ...·  1 月前    · 
文雅的洋葱  ·  android ...·  1 月前    · 
热情的八宝粥  ·  关于CryptoJS ...·  1 年前    · 
小眼睛的椅子  ·  C++ ...·  1 年前    · 
大方的滑板  ·  Team-based ...·  1 年前    · 

头疼的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