我正在努力实现以下目标
我期望的是:
Dialog Broadcast
<-------------------
OK!
<-------------------
OK!
....
<-------------------
OK!
但我得到的是:
Dialog Broadcast
<-------------------
<-------------------
....
<-------------------
(dialog dismiss)
OK!
OK!
....
OK!
如图所示,广播正在正确发送,但只有在解除对话后才会收到广播。我希望在显示对话框时收到它们。换句话说,步骤1和2工作正常,但3.正在部分工作。我认为可能是问题是我没有使用适当的上下文广播。
所以我的问题是:我应该使用哪个上下文来订阅更新(即接收广播,而不是发送它们),以便在显示时可以通过对话框拾取它们?
我尝试过Activity.this
,Activity.this.getBaseContext()
和Activity.this.getApplicationContext()
,dialog.getContext()
,DialogFragment.getActivity()
无效。
只是为了澄清:我多次使用BroadcastReceiver模式,在对话框中使用它时遇到了麻烦。
答案 0 :(得分:1)
事实:
<强>问题:强>
结论:
android.view.WindowLeaked exception will be thrown.
java.lang.IllegalArgumentException: View not attached to window manager
您问题的第二部分,涉及上下文
Dialog.getContext()
Dialog.getContext().equals(Context);
Class.isAssignableFrom(Class<?> c)
MyActivity.class.isAssignableFrom(ObjectToMatch.getClass());
我会忘记添加:
你总是使用宣传语言开始对话:)
&安培;还有一件事:
任何涉及UI的东西都要在UI THREAD 上完成,万一你会忘记&amp;得到
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
修改强>
我没有看到任何问题:工作解决方案
答案 1 :(得分:0)
这是BroadcastReceiver
,您可以根据代码进行调整。而不是Activity.this
,Activity.this.getBaseContext()
和Activity.this.getApplicationContext()
,您应该使用Context
,如下所示:
class BroadCastReceiverTest extends BroadcastReceiver {
Context context;
public void onReceive(Context c, Intent intent) {
this.context = c;
}
现在您必须使用this.context
作为Context
。
答案 2 :(得分:0)
尝试 Otto
https://github.com/square/otto
来自文档,
增强的基于Guava的事件总线,重点是Android支持。
Otto是一种活动总线,旨在解耦您的不同部分 申请,同时仍然允许他们有效沟通。
从番石榴分叉,奥托为已经添加了独特的功能 精致的活动总线以及专门的Android平台。