ContentObserver和getSupportLoaderManager

    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是在主线程执行的
 
posted @ 2015-10-09 11:46  游夜  阅读(614)  评论(0编辑  收藏  举报