Android java.lang.IllegalStateException:指定的消息队列同步屏障令牌尚未发布或已被删除

Android java.lang.IllegalStateException:指定的消息队列同步屏障令牌尚未发布或已被删除,android,runnable,illegalstateexception,android-handler,android-looper,Android,Runnable,Illegalstateexception,Android Handler,Android Looper,我正在尝试访问一些SharedReferences并在活动的onCreate()方法中的mainUiThread上打开一个对话框: 下面是我的一些onCreate()方法代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Handl

我正在尝试访问一些
SharedReferences
并在活动的
onCreate()
方法中的
mainUiThread
上打开一个
对话框

下面是我的一些
onCreate()
方法代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new Handler(Looper.getMainLooper()).post(new Runnable() {

        @Override
        public void run() {
            // Access shared Prefs, then inflate a dialog using the 
            // LayoutInflater class
        }
    });
}
我为什么这样做? 我注意到我用来访问
SharedReferences
的代码,然后打开
对话框
会给主线程带来沉重的负载,所以我把它放在
处理程序
中。我开始在Crashlytics上看到这个:

Fatal Exception: java.lang.IllegalStateException: The specified message queue synchronization  barrier token has not been posted or has already been removed.
   at android.os.MessageQueue.removeSyncBarrier(MessageQueue.java:289)
   at android.os.Looper.removeSyncBarrier(Looper.java:275)
   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5996)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
   at android.view.Choreographer.doCallbacks(Choreographer.java:574)
   at android.view.Choreographer.doFrame(Choreographer.java:544)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
   at android.os.Handler.handleCallback(Handler.java:733)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:136)
   at android.os.HandlerThread.run(HandlerThread.java:61)

有什么想法吗?

新处理程序(Looper.getMainLooper())
正在当前线程上创建
Handler
,当前线程就是那里的UI线程。也就是说,整个
处理程序
设置是毫无意义的。@MikeM。你知道如何正确地将其放在一个单独的线程上吗?@pskink你介意发布一个工作示例,访问
SharedReferences
,然后在读取一些prefs值后显示一个
对话框吗?@blueware为什么不使用AsyncTask??考虑到你不能在
SharedReferences
I中保存太多数据我宁愿看一看
布局
设计。为了保持良好的性能,充气布局需要低于16.66 ms。高于16.66 ms的每个充气都需要注意。所以,要么布局中嵌套过多,要么重叠过多,这会减慢膨胀速度,要么存在另一个代码,这对主线程来说很重。