gpt4 book ai didi

android - 从不同的 Activity 回来后 MainActivity 不更新

转载 作者:行者123 更新时间:2023-11-29 14:17:02 25 4
gpt4 key购买 nike

我有两个 Activity ,一个 MainActivity 和一个辅助 Activity (例如:关于屏幕),然后我有一个异步任务,它更新 MainActivity 上的 UI。这部分工作正常,asynctask 通过调用 MainActivity 中的一个方法来更新 UI,该方法会膨胀 UI 并设置一些值。此方法还使所有 UI 组件可见。

不起作用的是,在转到“关于”屏幕并返回到 MainActivity 后,用户界面完全是空白的。我不明白为什么这会在从其他 Activity 导航回来后停止工作,否则工作正常。

有人可以建议吗?

这是我绘制 UI 的方式。这就是我从线程更新它的方式,它一直有效,直到我转到关于屏幕:

private void DisplayMainContent()
{
Context context = Util.DataStruct.LoadContext();
Log.d("debug", "DisplayMainContent() loaded a context " + context.toString());

RelativeLayout parent = (RelativeLayout)((Activity)context).findViewById(R.id.action_settings);
LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = li.inflate(R.layout.activity_main, parent);

TextView version = (TextView) v.findViewById(R.id.latestVerField);

version.setText(Util.DataStruct.GetVal("version"));
}

最佳答案

关于消失数据的小故事..

  1. 建议:

    • 不要使用新的 Activity 来实现此目的 - 以对话或对话 fragment 的形式进行介绍

    nice example how to show dialog using fragment

    • 不要使用静态 - 而是使用单例模式

    单例保留了传统的类方法,不需要在任何地方都使用 static 关键字。它们最初可能对实现要求更高,但会大大简化您的程序的体系结构。与静态类不同,我们可以使用单例作为参数或对象。此外,您可以像使用任何其他类一样使用带有接口(interface)的单例。

  2. 我在哪里看到问题:

    这一行是你需要追查你的错误的全部:(我认为你的代码的任何其他 fragment 都与你的问题无关)

version.setText(Util.DataStruct.GetVal("version"));
  1. 解释原因:

    Util.DataStruct:

    • 应该是具有有效硬引用的单例,例如。在应用程序类或任何其他生命周期比您用来显示数据的 Activity 更长的类中。

    你知道垃圾收集器的存在吗?

    我想指出什么? 为什么你应该避免静电!?

    代码(数据)流:

    1. 应用启动 - 初始化静态类/变量等
    2. 您的变量是 feed(通过异步或其他方式)
    3. 您的应用已被 ANDROID 操作系统关闭 - 无论出于何种原因
    4. os 重新创建“堆栈”
    5. 但不是你的变量——它们是空的/空的/默认的——没有像它们在正常代码流中那样被值引用

    上下文:

    你从哪里使用你的 DisplayMainContent() ?你在那里需要什么背景?

    • 上下文应该是您需要它的应用程序方法的“ anchor ”。 (这就像某些安全性的东西——“嗨,这个应用程序 fragment 属于我,我有权修改和查看内容——所以做任何你通过最近的上下文你得到的东西——来自 fragment Activity 对话框小部件等”)

    • 如果您可以使用 getContext() 例如。 ("from parent") - 不要使用任何静态的

    例子:

    • fragment :
  @Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Context context = container.getContext();
}
  • 在适配器中:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Context context = parent.getContext();
}

关于通货膨胀 - 使用:

 LayoutInflater.from(context).inflate(res,ViewGroup,attachToRoot);
  • 你在通货膨胀中使用父级吗(在 fragment 中无疑你在 Activity 中使用可疑)

对于@bcorso:

enter image description here

不要使用超出您需要的资源。

@TomaszBest sorry, but you really don't know what you're talking about: Util.DataStruct.GetVal() is calling a static method of the static class Util.DataStruct, and therefore must return a static class variable. Static class variables are singletons (only one will ever be created), and it will not get garbage collected.

通过静态成员变量引用的对象被强引用,直到该类被卸载。普通的 ClassLoader 从不卸载类,但应用程序使用的类加载器会在正确的条件下卸载。

如果静态字段更改为引用不同的对象,则静态字段指向的原始对象与任何其他对象一样有资格进行 GC!

Section 2.11 Static Initializers of suns JVM spec. 中介绍了静态变量的初始化 该规范未定义垃圾回收的实现 - 静态对象的垃圾回收规则会因您的 VM 而异。

总结:

如果你的类永久持有这个对象,它只会在虚拟机退出时被释放。只有引导加载程序加载的类和接口(interface)可能不会被卸载。

关于android - 从不同的 Activity 回来后 MainActivity 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31757060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com