标签:
private class MsgObsever extends ContentObserver { public MsgObsever() { super(msgHandler); } @Override public void onChange(boolean selfChange) { Log.d("123456", "hailing -----onChange"); if (TextUtils.isEmpty(content)) { Loader loader = getSupportLoaderManager().getLoader(QUERY_WORKGROUP); if (null != loader) { getSupportLoaderManager().restartLoader(QUERY_WORKGROUP, null, WorkGroupActivity.this); } else { getSupportLoaderManager().initLoader(QUERY_WORKGROUP, null, WorkGroupActivity.this); } return; } else { Loader loader = getSupportLoaderManager().getLoader(SEARCH_WORKGROUP); if (null != loader) { getSupportLoaderManager().restartLoader(SEARCH_WORKGROUP, null, WorkGroupActivity.this); } else { getSupportLoaderManager().initLoader(SEARCH_WORKGROUP, null, WorkGroupActivity.this); } } } }
private MsgObsever msgObsever=new MsgObsever();
MsgObsever用来监听数据库的变化,如果数据库变化了用
getSupportLoaderManager来重新查询数据库
在实际使用中第一次数据改变的时候 界面不会发生改变 第二次改变数据 就报了崩溃
10-09 10:09:33.658: E/ACRA(9288): ACRA caught a RuntimeException for com.zhf.cloudphone 10-09 10:09:33.658: E/ACRA(9288): java.lang.RuntimeException: Unable to resume activity {com.zhf.cloudphone/com.zhf.cloudphone.activity.WorkGroupActivity}: java.lang.NullPointerException 10-09 10:09:33.658: E/ACRA(9288): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2812) 10-09 10:09:33.658: E/ACRA(9288): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2841) 10-09 10:09:33.658: E/ACRA(9288): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 10-09 10:09:33.658: E/ACRA(9288): at android.os.Handler.dispatchMessage(Handler.java:102) 10-09 10:09:33.658: E/ACRA(9288): at android.os.Looper.loop(Looper.java:136) 10-09 10:09:33.658: E/ACRA(9288): at android.app.ActivityThread.main(ActivityThread.java:5146) 10-09 10:09:33.658: E/ACRA(9288): at java.lang.reflect.Method.invokeNative(Native Method) 10-09 10:09:33.658: E/ACRA(9288): at java.lang.reflect.Method.invoke(Method.java:515) 10-09 10:09:33.658: E/ACRA(9288): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 10-09 10:09:33.658: E/ACRA(9288): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 10-09 10:09:33.658: E/ACRA(9288): at dalvik.system.NativeStart.main(Native Method) 10-09 10:09:33.658: E/ACRA(9288): Caused by: java.lang.NullPointerException 10-09 10:09:33.658: E/ACRA(9288): at android.support.v4.app.LoaderManagerImpl.doStart(LoaderManager.java:714) 10-09 10:09:33.658: E/ACRA(9288): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:575) 10-09 10:09:33.658: E/ACRA(9288): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171) 10-09 10:09:33.658: E/ACRA(9288): at android.app.Activity.performStart(Activity.java:5241) 10-09 10:09:33.658: E/ACRA(9288): at android.app.Activity.performRestart(Activity.java:5297) 10-09 10:09:33.658: E/ACRA(9288): at android.app.Activity.performResume(Activity.java:5302) 10-09 10:09:33.658: E/ACRA(9288): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2802) 10-09 10:09:33.658: E/ACRA(9288): ... 10 more
查看崩溃的日志 报的是空指针的错误 但是没有具体指向代码 一时间找不到是那边出错了
后来同事把MsgObsever 的实例放到了oncreate后就好了 oncreate执行的时候msgHandler已经实例化 就是说ContentObserver 里面的handler 传null进去就会有问题
10-09 11:07:28.598: E/JavaBinder(18990): *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 10-09 11:07:28.598: E/JavaBinder(18990): java.lang.RuntimeException: Can‘t create handler inside thread that has not called Looper.prepare() 10-09 11:07:28.598: E/JavaBinder(18990): at android.os.Handler.<init>(Handler.java:200) 10-09 11:07:28.598: E/JavaBinder(18990): at android.os.Handler.<init>(Handler.java:114) 10-09 11:07:28.598: E/JavaBinder(18990): at android.support.v4.content.Loader$ForceLoadContentObserver.<init>(Loader.java:53) 10-09 11:07:28.598: E/JavaBinder(18990): at android.support.v4.content.CursorLoader.<init>(CursorLoader.java:100) 10-09 11:07:28.598: E/JavaBinder(18990): at com.zhf.cloudphone.activity.WorkGroupActivity.onCreateLoader(WorkGroupActivity.java:339) 10-09 11:07:28.598: E/JavaBinder(18990): at android.support.v4.app.LoaderManagerImpl.createLoader(LoaderManager.java:490) 10-09 11:07:28.598: E/JavaBinder(18990): at android.support.v4.app.LoaderManagerImpl.createAndInstallLoader(LoaderManager.java:499) 10-09 11:07:28.598: E/JavaBinder(18990): at android.support.v4.app.LoaderManagerImpl.restartLoader(LoaderManager.java:646) 10-09 11:07:28.598: E/JavaBinder(18990): at com.zhf.cloudphone.activity.WorkGroupActivity$MsgObsever.onChange(WorkGroupActivity.java:309) 10-09 11:07:28.598: E/JavaBinder(18990): at android.database.ContentObserver.onChange(ContentObserver.java:129) 10-09 11:07:28.598: E/JavaBinder(18990): at android.database.ContentObserver.dispatchChange(ContentObserver.java:163) 10-09 11:07:28.598: E/JavaBinder(18990): at android.database.ContentObserver$Transport.onChange(ContentObserver.java:195) 10-09 11:07:28.598: E/JavaBinder(18990): at android.database.IContentObserver$Stub.onTransact(IContentObserver.java:60) 10-09 11:07:28.598: E/JavaBinder(18990): at android.os.Binder.execTransact(Binder.java:404) 10-09 11:07:28.598: E/JavaBinder(18990): at dalvik.system.NativeStart.run(Native Method)
后来发现第一次数据改变的时候有这个日志 跑到源码里查看
public final class More ...ForceLoadContentObserver extends ContentObserver { 52 public More ...ForceLoadContentObserver() { 53 super(new Handler()); 54 } 55 56 @Override 57 public boolean More ...deliverSelfNotifications() { 58 return true; 59 } 60 61 @Override 62 public void More ...onChange(boolean selfChange) { 63 onContentChanged(); 64 } 65 }
ForceLoadContentObserver类构造函数会new 一个handler 而我们MsgObsever 的onchange因为传进去的handler是null的 所以onchange是在异步线程里执行的 就会报上面的错误
所以解决的方法就是getSupportLoaderManager要放到主线程来执行 所以把MsgObsever 的实例放到了oncreate后就好了 因为这时候onchange是在主线程执行的
ContentObserver和getSupportLoaderManager
标签:
原文地址:http://www.cnblogs.com/youye/p/4863530.html