从不同的活动回来后,MainActivity不会更新

时间:2015-08-01 00:35:37

标签: android

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

什么不起作用,在进入“关于”屏幕并返回到MainActivity之后,UI完全空白。我不明白为什么在从不同的活动导航后停止工作,否则工作正常。

有人可以提出建议吗?

这是我绘制UI的方式。这是我从线程更新它的方式,它可以工作,直到我进入about屏幕:

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 个答案:

答案 0 :(得分:-2)

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

  1. 建议:

    • 不要使用新活动来实现此目标 - 按照对话框或对话框片段进行操作

    nice example how to show dialog using fragment

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

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

  2. 我看到问题:

    这条线是你需要追踪的错误: (我认为你的代码的任何其他片段都与你的问题无关)

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

      Util.DataStruct:

      • 应该是单身,有效的硬参考例如。在申请类或任何其他寿命更长的用途,用于显示数据。
      你知道垃圾收集器的存在吗?

      我想指出的是什么? 为什么你应该避免STATIC!?

      代码(数据)流程:

      1. app已启动 - 初始化静态类/变量等
      2. 您的变量是Feed(通过异步或其他方式)
      3. 您的应用已被ANDROID OS关闭 - 无论原因是什么
      4. os重新创建“stack”
      5. 但不是你的变量 - 它们是空的/ null / defalt - 没有被值引用,因为它们在正常的代码流中显示
      6. <强>上下文

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

        • 上下文应该是需要它的应用程序方法的“锚点”。 (这就像某些安全性东西 - “嗨,这个应用程序片段属于我,我有权修改和查看内容 - 所以要做任何结果你传递最近的上下文你得到 - 从片段活动对话框小部件等”)

          < / LI>
        • 如果您可以使用 getContext(),例如。 (“来自父母”) - 不要使用任何静态的

        示例:

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

        关于通胀   - 使用:

         LayoutInflater.from(context).inflate(res,ViewGroup,attachToRoot);
        
        • 你是否在通货膨胀中使用父母(在片段中无疑你在活动中使用可疑)

        表示@bcorso:

        enter image description here

        请勿使用超出您需要的资源。

          

        @TomaszBest抱歉,但你真的不知道你在说什么   about:Util.DataStruct.GetVal()正在调用静态方法   静态类Util.DataStruct,因此必须返回一个静态类   变量。静态类变量是单例(只有一个是单例)   创建),它不会收集垃圾。

        在卸载类之前,强烈引用通过静态成员变量引用的对象。普通的ClassLoader从不卸载类,但应用程序使用的类在适当的条件下执行。

        如果更改静态字段以引用其他对象,则静态字段指向的原始对象就像其他任何对象一样符合GC的条件!

        静态变量的初始化包含在 Section 2.11 Static Initializers of suns JVM spec. 中。规范没有定义垃圾收集的实现 - 静态对象的垃圾收集规则会因您的VM而异。

        总结:

        如果您的类永久保留此对象,则只有在vm退出时才会释放它。只有自举加载程序加载的类和接口可能无法卸载。