可悲的是,这段代码过于复杂,无法发布所有空隙。但是,我会尽力给出可能导致问题的稀疏代码。
因此,我在表面上运行了一些东西,当数据库上的内容更新时,它会推出广播(它基本上是一个监视服务器的接口(一个未连接到互联网的接口))。我有广播接收器正在收听这些广播并在我们正在寻找的广播时在Handler上运行Runnable。
我正在使用从主要活动调用的片段活动。该活动具有可变数量的片段,其具有可变数量的“小部件”。这些小部件具有它们自己的广播接收器,如上所述,它们正在收听和响应。因此,每个广播仅在创建视图时注册,并在删除时注册,因此每个广播接收器包含对项目的引用。
问题是当我打开第二个活动时,在我的主要活动上使用相同的确切工作逻辑不起作用。出于某种原因,当我请求它时,视图将不会更新(例如textView.setText(“blah”)将在主活动上显示“blah”,但在此新活动上不显示任何内容)。使用print语句,我注意到它认为它已更新,所以如果我要调用“textView.setText(”blah“)”然后打印“textView.getText()”它会打印出“blah”尽管注意到在UI上。
这是我用来从BroadcastReceiver中调用任务的代码(请注意,item是对项目的弱引用):
task = new MyRunnable();
if (item.get().getView() == null) return;
item.get().getView().post(task);
这是其中一个更新runnables的代码(其中param是广播的意图,context是应用程序上下文,nameOfTextView是文本视图的名称。):
String arg = param.getStringExtra(broadcast);
if (arg == null) return;
int id = context.getResources().getIdentifier(nameOfTextView,
"id", context.getPackageName());
View view = item.get().getView();
if (id == 0 || view == null || !view.isShown()) return;
TextView v = (TextView) view.findViewById(id);
v.setText(arg);
我已经在这几个小时没有运气了。我最好的猜测是,由于某种原因,它没有引用正确的小部件。但是,这似乎不太可能,因为每个广播都是由小部件创建的,这意味着它传入的引用应该是有效的。
提前感谢您的帮助!
更新
经过@Mark Herscher的一个很好的建议后,我确定我的猜测不正确。事实上,它试图改变的视图是在UI上显示的相同视图。我已经检查过,三重检查,发现问题并修复了运行两次的线程的问题,但UI仍然没有正确更新。
同样,在主要活动上使用相同的广播和runnables似乎不会发生这种情况。这个问题与其他活动是隔离的。
对于那些要求,这里是开始其他活动的几行代码:
Intent i = new Intent(MainActivity.this, GlobalSettingsActivity.class);
i.putExtra(REQUEST_CODE, GLOBAL_SETTINGS);
startActivityForResult(i, GLOBAL_SETTINGS);
这些活动扩展了一个超类型,它使用相同的代码生成。
答案 0 :(得分:0)
我怀疑你是否在第二个活动中启动了AsyncTask。请确保您当前的活动尚未启动AsyncTask。如果AsyncTask正在后台执行,请对其进行评论并再次测试应用程序。让我知道你的结果。
答案 1 :(得分:0)
我同意这听起来像你正在引用旧视图并更新它。
要对此进行测试,请在Activity的onCreate()中将所有相关视图的标记*设置为随机数。它需要一个Object但你可以获得一个int然后将其转换为Integer。然后,您可以在调试时检索标记值并打印其值。这应该有助于告诉您实际上是在更新同一个实例,还是有多个不需要的实例。
当然,这无法帮助您修复发生的 ,如果没有更多代码,很难说。
答案 2 :(得分:0)
我注意到代码if (arg == null)
返回,但String参数可能为空。对于调试建议,如果阻塞,请执行Log.d(TAG, "param= " + arg);
。如果您想查看是否存在并发问题,可以执行arg = arg +(增量编号)等代码。然后编写Log.d。
您的帖子对问题不太清楚,我建议您在帖子底部的某处再次说明问题。