View on New Activity Not Updating On UI Thread



遗憾的是,这段代码太复杂了,无法发布所有的空格。然而,我将尽我所能给出可能导致问题的少量代码。

所以我有一些东西在表面下运行,每当数据库上的东西更新时,它就会推出广播(这基本上是一个监控服务器的接口(一个没有连接到互联网的服务器)在android上)。我有广播接收器,它正在侦听这些广播,并在处理程序上运行Runnable,每当我们获得我们正在寻找的广播时。

我正在使用从主活动调用的片段活动。此活动具有可变数量的片段,这些片段具有可变数量的"小部件"。这些小部件有它们自己的广播接收器,它们像上面提到的那样侦听和响应。因此,每个广播只在视图创建时注册,在视图删除时取消注册,因此每个广播接收器都包含对该项的引用。

问题是,当我打开第二个活动时,在我的主要活动上使用相同的精确工作逻辑不起作用。由于某种原因,当我请求它这样做时,视图将不会更新(例如textView.setText("blah")将在主活动上显示"blah",但在这个新活动上什么也不显示)。使用print语句,我注意到它认为它是更新的,所以如果我调用"textView.setText("blah")",然后打印"textView.getText()",它会打印出"blah",尽管注意显示在UI上。

这是我用来从BroadcastReceiver内调用任务的代码(注意,item是对item的弱引用):

task = new MyRunnable();
if (item.get().getView() == null) return;
item.get().getView().post(task);

这是一个更新可运行程序的代码(其中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仍然没有正确更新。

再次,这似乎不会发生使用相同的广播和运行在主活动。此问题与其他活动无关。

对于那些问的人,这里是启动其他活动的几行代码:

Intent i = new Intent(MainActivity.this, GlobalSettingsActivity.class);
i.putExtra(REQUEST_CODE, GLOBAL_SETTINGS);
startActivityForResult(i, GLOBAL_SETTINGS);

这些活动扩展了使用要生成的相同代码的超类型。

我怀疑你已经在第二个活动中启动了AsyncTask。请确保您当前的活动没有启动一个AsyncTask。如果AsyncTask在后台执行,请注释并再次测试应用程序。让我知道你的结果。

我同意这听起来像是你持有一个旧视图的引用并更新它。

为了测试这一点,在你的Activity的onCreate()中设置所有相关视图的标签*为一个随机数。它接受一个Object但是你可以得到一个int然后把它转换成Integer。然后,您可以在调试时检索标记值并打印它们的值。这应该有助于告诉你,如果你实际上是在更新同一个实例,或者如果你有多个不需要的实例。

当然,这并不能帮助你修复是如何发生的,如果没有更多的代码,很难说。
  • (http://developer.android.com/reference/android/view/View.html setTag (java . lang . object))

我注意到代码if (arg == null)返回,但是String参数可能是空的。对于调试建议,在if块之后执行Log.d(TAG, "param= " + arg);。如果您想查看是否存在并发问题,您可以执行像arg = arg +(增量数)这样的代码。然后写入Log.d.

你的帖子对问题不太清楚,我建议在你帖子底部的某个地方再次说明问题。

最新更新