【问题标题】:Update Android UI component from another class从另一个类更新 Android UI 组件
【发布时间】:2014-05-26 15:32:06
【问题描述】:

我有另一个类,它需要在我的 UI 中更新进度条,同时进行处理。 我尝试了 2 种方法,都将我的 ProgressBar 变量设置为 null,所以我最终总是得到 NullPointerException:

方法一)

MyClass tmp = new MyClass();
tmp.setProgressBar(myprg);    // myprg is ProgressBar variable and already have value from findViewById function

然后在 MyClass 中:

public void SetProgressBar(ProgressBar prg)
{
localprg = prg;   // I put breakpoint here, it's null after assignment
}

方法二)

MyClass tmp = new MyClass(container.getContext());
tmp.findProgressBar();

在 MyClass 中:

public class void findProgressBar()
{
localprg = (ProgressBar) ((Activity)c).findViewById(R.id.progress_bar);
}

都失败了,都使得 localprg = null。

【问题讨论】:

  • IS myprg 也为空?
  • myprg 在我自己的类(调用者类)中不,它不为空。但是在 MyClass 中,它突然变成了 null
  • 所以首先获取 myPrg 的实例
  • 当你离开 SetProgress 栏,或者当你退出 findProgressBar() 时它会被清空?在Java中所有都是作为值传递的,意味着ProgressBar是一个本地值,当SetProgressbar离开时不再活跃,得到null,你通过引用localprg分配了value变量,意味着,这也得到null。
  • 不,localprg 是整个类的局部变量,而不是该函数的局部变量。任何@GiruBhai:我已经在我自己的类(调用者类)中有 myPrg 的实例,所以我将它传递给另一个类中的那个函数,它在那里变为 null,所以它将 null 分配给已经为 null 的局部变量

标签: java android


【解决方案1】:

正如我在我的 cmets 中所说的。在java中,所有都是通过值传递的。不是通过参考。 方法签名中的参数就像您在方法存根中本地定义它一样工作。如果您确实需要在类属性中传递和更改 UI 对象,请尝试将方法签名中的参数更改为 AtomicReference。这不是正确的方法。 但是这里仍然是一个链接,它加强了我的答案:

Pass object by reference in Java

看起来,您想在运行时流畅地增加进度条。您的 class 属性似乎很关心计算值,该值用于指示进度条的进度。 这不是正确的方法。

a) 您通过将父对象传递给子属性来创建交叉引用。这不是好的做法,并且会产生强耦合。

b) 繁重的计算应该在自己的工作线程(非 ui 线程)中运行,然后宣布 ui 线程通过带有事件参数的事件。然后事件订阅者可以决定如何对此做出反应 事件。您可以将其理解为“java 事件处理”或“java 观察者模式”。

c) 线程?一个自己的大话题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多